Rails 5:使用带有参数的 form_with 预填充搜索表单输入,而无需为每个字段手动执行此操作

san*_*e89 5 ruby-on-rails

假设我们有一个简单的搜索表单,它提交一个用于搜索/过滤的 GET 请求:

<%= form_with(scope: :search, url: url_for, local: false, method: :get) do |f| %>
  <%= f.text_field :title %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

当我们使用form_with(或旧的form_forActiveRecord 对象时,所有字段都会自动预先填充 AR 对象属性的当前值。

但在上面的示例中,如果我们仅使用范围(在本例中为search),则当我们使用如下 URL 打开页面时,不会发生这种情况:

http://localhost:3000/blog?search%5title%5D=test

即使 URL 很难为我们填充 Rails params[:search]{title: 'test'}它仍然需要手动传递每个字段的值,如下所示:

<%= f.text_field :title, value: params.dig(:search, :title) %>

随着搜索表单的增长,这变得非常乏味且容易出错,并且这似乎是一个常见的要求,我无法相信没有一种更“轨道的方式”可以在不诉诸表单对象设计模式之类的情况下做到这一点。

是否有任何自动方法可以预先填充这些输入,而不必从参数手动传递值?

Ger*_*alt 0

我认为您可以使用控制器操作中的参数值创建一个新的搜索对象。然后 form_with/form_for 应该预先填写输入字段。也许是这样的:

@search = Search.new(params[:search])

希望有帮助。