小编San*_*kai的帖子

在 Rails 5.1 中使用 Turbolinks 无法正确呈现 React 组件

我有一个非常简单的 Rails 应用程序,它有一个 React 组件,它只在特定页面(假设显示页面)的现有div 元素中显示“Hello” 。

当我使用其 URL 加载相关页面时,它可以工作。我在页面上看到你好

但是,当我之前在另一个页面上时(假设是索引页面,然后我使用 Turbolinks转到显示页面,好吧,除非我再次来回切换,否则不会呈现该组件。(回到索引页面)并返回显示页面)

从这里每次来回,我可以说视图渲染了两次。
不仅两次,而且两次!(即 2 次,然后是 4 次,然后是 6 次等等。)

我知道,因为同时我设置了div我向控制台输出一条消息的内容。

事实上,我想回到索引页应该仍然运行没有显示的组件代码,因为div 元素不在索引页上。但为什么以累积的方式呢?

我想解决的问题是:

  1. 显示页面的第一个请求上运行代码
  2. 阻止代码在其他页面(包括索引页面)中运行
  3. 显示页面的后续请求上运行一次代码

这是我使用的确切步骤和代码(我会尽量简洁。)

ruby-on-rails turbolinks reactjs

7
推荐指数
1
解决办法
3430
查看次数

Ruby默认赋值(|| =)vs Rescuing error

由于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中实现,以及它是否真的与可能带来的微小优化有关.

ruby if-statement

5
推荐指数
1
解决办法
211
查看次数

在Docker中使用Capybara和无头硒浏览器进行Rails系统测试

TL; DR:关于如何正确配置水豚以便能够使用默认的Rails minitest系统测试在docker容器中驱动远程硒浏览器的想法?

我正在dockerized环境中运行Rails。现在,我想开始一些“系统测试”,但是由于我是在Docker内部运行的,所以我遇到了一些问题。

我正在使用默认的测试套件(最小?)capybaraselenium-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

5
推荐指数
1
解决办法
2099
查看次数

为什么重定向到#show动作而不传递:id param work(在rails中)?

我有一个关于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 …

ruby ruby-on-rails

4
推荐指数
1
解决办法
1119
查看次数

修改合并分支后如何修改合并?

我习惯于--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)并不复杂,我只是硬重置一些提交并一次性提交。

那么我怎样才能在合并的主服务器上带来这种变化(+)呢?
因为当我的机会更少并且无法进行硬重置时

非常感谢。

git

2
推荐指数
1
解决办法
1907
查看次数