Ruby on rails Rails 5:使用带有参数的form_预填充搜索表单输入,而不必为每个字段手动填充

Ruby on rails Rails 5:使用带有参数的form_预填充搜索表单输入,而不必为每个字段手动填充,ruby-on-rails,Ruby On Rails,假设我们有一个简单的搜索表单,它提交一个GET请求以进行搜索/筛选: <%= form_with(scope: :search, url: url_for, local: false, method: :get) do |f| %> <%= f.text_field :title %> <% end %> 当我们将form_与一起使用时(或将form_与一起使用时)与ActiveRecord对象一起使用时,所有字段都会自动预填充AR对象属性的当前值

假设我们有一个简单的搜索表单,它提交一个GET请求以进行搜索/筛选:

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

当我们将
form_与
一起使用时(或将
form_与
一起使用时)与ActiveRecord对象一起使用时,所有字段都会自动预填充AR对象属性的当前值

但是在上面的例子中,如果我们只使用一个作用域(在我们的例子中是,
search
),当我们使用如下URL打开页面时,不会发生这种情况:

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

即使URL将使rails使用
{title:'test'}
填充
params[:search]
对我们来说,仍然需要手动传递每个字段的值,如下所示:


随着搜索表单的增长,这变得非常乏味且容易出错,这似乎是一个非常普遍的要求,以至于我不相信没有一种更为“rails方式”的方式可以做到这一点,而不使用类似的方法


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

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

@search=search.new(参数[:search])

希望有帮助

搜索不是我的应用程序中的模型

您可以创建任意数量的模型。此模型将保存用于搜索的值和逻辑。当您将此对象传递到
表单_中时,它将填充为对象中的属性设置的值。在models目录中创建以下类

class Search
  include ActiveModel::Model

  attr_accessor :title

  validates :title, presence: true
end
  • 通过包含
    include-ActiveModel::Model
    可以获得“免费”的逻辑。例如
    Search.new(params)
    ,它会将params散列中的所有键分配给模型属性(只要它们是由
    attr\u访问器定义的)
  • 当您想要向使用您的搜索表单的用户提供反馈时,您可以获得非常方便的验证
  • 稍后,当您的搜索模型获得更多的逻辑时,为该模型编写单元测试

ransack是一个选项吗?您考虑过创建搜索对象吗?它的行为与ActiveRecord对象完全相同(就预填充表单而言).@SujanAdiga不是真的,但我会把它保存在我的radar@MrShemek是的,但我想避免它。问题提到“我不相信没有一种更‘rails’的方式不借助表单对象设计模式来实现这一点”,我认为这就是你提到的‘搜索对象’模式,对吗?
搜索
不是一个模型在我的应用程序中。这就是为什么我使用了
scope::search
而不是
model::search
。Chris感谢您的回答,但这基本上就是我在问题中提到的表单对象设计模式,我已经知道,并且正在寻找不需要为每个表单定义类的替代方案。定义新表单有什么问题类?这是OO的基本思想:)