ruby-on-rails - rails 5 : prepopulate search form inputs using form_with with params without having to do it manually for each field

标签 ruby-on-rails

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

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

当我们使用 form_with (或旧的 form_for )与 ActiveRecord 对象 ,所有字段都会自动预填充 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) %>
随着搜索表单的增长,这变得非常乏味且容易出错,而且似乎是一个常见的要求,我无法相信没有更“rails 方式”可以做到这一点而不求助于 Form Objects Design Pattern 之类的东西。 .

没有任何自动预填充这些输入的方法,而不必从 params 手动传递值?

最佳答案

Search is not a model in my application



您可以根据需要创建任意数量的模型。此模型将保存搜索的值和逻辑。当您将此对象传递给 form_for 时它将填充为对象中的属性设置的值。在您的模型目录中创建以下类
class Search
  include ActiveModel::Model

  attr_accessor :title

  validates :title, presence: true
end
  • 通过包含 include ActiveModel::Model你得到“免费”的逻辑。如Search.new(params)它会将 params 散列中的所有键分配给您的模型属性(只要它们由 attr_accessor
  • 定义)
  • 当您想向使用搜索表单的用户提供反馈时,您会获得非常方便的验证
  • 稍后当您的搜索模型获得更多逻辑时为此模型编写单元测试
  • 关于ruby-on-rails - rails 5 : prepopulate search form inputs using form_with with params without having to do it manually for each field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999925/

    相关文章:

    ruby-on-rails - 使用 simple_form 更改默认错误消息

    ruby-on-rails - 将我的模型 ID 放入我的表单中是否安全?

    ruby-on-rails - Rails : Excel columns, 种子

    ruby-on-rails - 设计确认 token 无效

    ruby-on-rails - 尝试验证日期

    ruby-on-rails - 编辑和测试现有 Ruby gem(即 Gollum)的最佳方法是什么?

    ruby-on-rails - Rails 为单个模型插入多条记录

    ruby-on-rails - 检索密码哈希时出现编码错误

    ruby-on-rails - 在 rails 配置文件和 javascript 之间共享变量

    mysql - 在 Rails 中的多个数据库之间切换而不中断事务