我有一个非常简单的 Rails 应用程序,它有一个 React 组件,它只在特定页面(假设显示页面)的现有div 元素中显示“Hello” 。
当我使用其 URL 加载相关页面时,它可以工作。我在页面上看到你好。
但是,当我之前在另一个页面上时(假设是索引页面,然后我使用 Turbolinks转到显示页面,好吧,除非我再次来回切换,否则不会呈现该组件。(回到索引页面)并返回显示页面)
从这里每次来回,我可以说视图渲染了两次。
不仅两次,而且两次!(即 2 次,然后是 4 次,然后是 6 次等等。)
我知道,因为同时我设置了div我向控制台输出一条消息的内容。
事实上,我想回到索引页应该仍然运行没有显示的组件代码,因为div 元素不在索引页上。但为什么以累积的方式呢?
我想解决的问题是:
这是我使用的确切步骤和代码(我会尽量简洁。)
我有一个安装了 react 的 Rails 5.1 应用程序:
rails new myapp --webpack=react
Run Code Online (Sandbox Code Playgroud)然后我创建了一个简单的Item脚手架来获取一些页面:
rails generate scaffold Item name
Run Code Online (Sandbox Code Playgroud)我只是在显示页面 …
由于a ||= 1相当于a || a = 1,可以说这是同义词糖:
if a.nil?
a = 1
end
Run Code Online (Sandbox Code Playgroud)
同样,鉴于它session是类似哈希的对象,以下内容:
def increment_session_counter
session[:counter] ||= 0
session[:counter] += 1
end
Run Code Online (Sandbox Code Playgroud)
相当于:
def increment_session_counter
if session[:counter].nil?
session[:counter] = 0
end
session[:counter] += 1
end
Run Code Online (Sandbox Code Playgroud)
这是否意味着if每次在原始定义中都会执行隐式语句increment_session_counter?因为session[:counter]很可能nil只是第一次(即<< 1%的时间),我觉得以下代码更好,因为if每次都不会触发隐式:
def increment_session_counter
session[:counter] += 1
rescue NoMethodError
session[:counter] = 1
end
Run Code Online (Sandbox Code Playgroud)
这种代码在这种意义上是否更好?
话虽如此,我不知道如何Rescue在ruby中实现,以及它是否真的与可能带来的微小优化有关.
TL; DR:关于如何正确配置水豚以便能够使用默认的Rails minitest系统测试在docker容器中驱动远程硒浏览器的想法?
我正在dockerized环境中运行Rails。现在,我想开始一些“系统测试”,但是由于我是在Docker内部运行的,所以我遇到了一些问题。
我正在使用默认的测试套件(最小?)capybara和selenium-webdrivergems。
我已经chromedriver使用以下方法在容器中安装了数据包:
RUN apt-get install -y chromedriver \
&& ln -s /usr/lib/chromium-browser/chromedriver /usr/local/bin
Run Code Online (Sandbox Code Playgroud)
但是运行时rails test:system输出以下错误Selenium::WebDriver::Error::WebDriverError: Unable to find chromedriver.
实际上,我不知道是否安装了chrome本身?
which chrome什么都不输出。
which chromium输出/usr/bin/chromium。
我也尝试了xvfb没有成功。
因此(由于我一无所知),我尝试了更进一步,实际上也使用了dockerized系统测试环境。
我从硒中找到了一些Docker映像。所以我在Rails和数据库容器中运行了一个selenium-standalone-chrome容器(我正在使用的实际docker-compose.yml在此处)
然后,我发现了一些有关配置的有用信息,以使capybara驱动程序成为远程硒浏览器。
我在互联网上找到的所有示例都使用rspec,但是由于我使用的是默认的minispec,因此我尝试使capybara驱动程序适应minispec,但我对如何执行以及将配置放在何处有些疑问。
对于系统测试,我猜测最好的位置是文件application_system_test_case.rb。我也发现了,并尝试了许多不同的水豚配置,最后得到以下似乎最完整的配置(可在此处获得)
那时测试似乎表现良好,因为我没有错误,但始终失败。
无论setup_remote在测试用例之前调用驱动程序配置(定义服务器主机和端口的方法)如何,它都会失败。
无论有无通话,我都收到“无法访问站点”错误(这是屏幕截图),
这是我使用的测试文件。(测试一些反应动态显示)
但是,我可以从主机上的浏览器访问具有给定URL的硒容器。并且两个容器都可以看到对方。我在容器外壳中执行了一些ping操作。
下列有帮助的SO问题对我不起作用:
Dockerized硒浏览器无法访问Capybara测试URL
如何在Rails 5.1中运行无头浏览器系统测试? …
selenium integration-testing automated-tests ruby-on-rails docker
我有一个关于rails的简单问题.
我按照教程(来自CrashLearner).在该教程中,我们有一个简单的资源message,可以生成常规的以下路由(摘录自rake routes)
Prefix Verb URI Pattern Controller#Action
messages GET /messages(.:format) messages#index
POST /messages(.:format) messages#create
new_message GET /messages/new(.:format) messages#new
edit_message GET /messages/:id/edit(.:format) messages#edit
message GET /messages/:id(.:format) messages#show
PATCH /messages/:id(.:format) messages#update
PUT /messages/:id(.:format) messages#update
DELETE /messages/:id(.:format) messages#destroy
Run Code Online (Sandbox Code Playgroud)
据我了解,获得show此控制器操作的路径就像是某种东西/messages/17,我的意思是我们必须放置:id我们想要查看的特定消息.
所以,如果我需要在修改它之后将用户重定向到此消息视图(在#update操作中),我应该使用:
redirect_to message_path(17)
Run Code Online (Sandbox Code Playgroud)
但事实证明,省略这一点:id实际上很有效:
redirect_to message_path
Run Code Online (Sandbox Code Playgroud)
为什么以及如何使用这个?
因为这可以从实际接收到:id参数的动作开始,所以我认为控制器会将其保留在内存中,并在缺少时将其传递给引擎盖,但是我想知道这种行为来自何处?
我在rails文档中找不到任何内容.
这是本教程的github存储库,因此上述行的确切具体位置在此控制器中.
我确认这是有效的.
还有一个Comment嵌套在以前Message资源中的资源.正如你所看到的在该控制器update动作,更新评论(被嵌套在消息中)之后,控制器重定向到message_path,但在这种情况下,:id …
我习惯于--amend --no-edit在分支或 master上使用 向我的最后一次提交添加一些小的更改(如错字或格式)。
然而,今天我第一次遇到了一个小问题。
在将该分支与 master 合并后,我修改了该分支上的提交。
* branch (X+) (amended) (this is a chronological view
| since in fact there is
| only one commit here)
* master (X) <=> * branch (X) (merged)
| |
| /
| /
+--------------/
|
Run Code Online (Sandbox Code Playgroud)
那么我怎样才能在合并的主服务器上带来这种变化(+)呢?
我尝试了一些其他合并,但这带来了一些奇怪的合并提交。
由于原始更改(X)并不复杂,我只是硬重置一些提交并一次性提交。
那么我怎样才能在合并的主服务器上带来这种变化(+)呢?
因为当我的机会更少并且无法进行硬重置时
非常感谢。