通过 form_for 提交的参数不是模型实例的属性?

Submit a parameter via form_for that isn't an attribute on the model instance?

我有一个比较简单的问题。我有一个很好用的 form_for,我想传递一个不属于用户模型或任何关联模型的随机参数(例如,它不应该依赖 accepts_nested_attributes_for ).

当我尝试将其添加到表单时:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>

<h2>Sign up</h2
  
  <%= f.label :first_name %>
  <%= f.text_field :first_name %>

  <%= f.label :foo %>
  <%= f.text_field :foo %>

  <%= f.submit "Sign up" %>

<%= render "devise/shared/links" %>
<% end %>

加载视图时出现此错误:

undefined method `foo' for #<User id: nil, first_name: nil, last_name: nil, admin: nil, last_seen_at: nil, time_zone: nil, phone: nil, temp_role: nil, created_at: nil, updated_at: nil, email: "">

我明白错误发生的原因;因为 User 模型上没有 foo 属性。

但我仍然想将 foo 变量传递给控制器​​。最好的方法是什么(假设 一种方法)?

有一种方法可以在不编辑模型的情况下执行此操作,如果此参数实际上不是模型的一部分,那可能会很方便。

您可以像这样在 form_for 中添加普通标签:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>

<h2>Sign up</h2
  
  <%= f.label :first_name %>
  <%= f.text_field :first_name %>

  <%= label_tag :foo %>
  <%= text_field_tag :foo %>

  <%= f.submit "Sign up" %>

<%= render "devise/shared/links" %>
<% end %>

在这种情况下,参数 foo 将在 user 散列之外,因此 params 将类似于

{"user"=> ["first_name"=> "Bob"], "foo"=>"bar"...}