如何将form_for帮助器中的对象传递给方法?

时间:2010-05-20 04:10:25

标签: ruby-on-rails

所以,假设我有一个表格被发送到奇怪的地方(我们的意思是奇怪,不是默认路线:

<% form_for @form_object, :url => {:controller => 'application',
                  :action => 'form_action_thing'} do |f| %>
  <%= f.text_field :email %>
  <%= submit_tag 'Login' %>
<% end %>

现在让我们说我们有接受它的方法。

def form_action_thing
  User.find(????? :email ?????)
end

我的问题是:

  1. 如何使对象@form_object可用于接收方法(在本例中为form_action_tag)?
    • 我已经尝试了params[:form_object],我已经搜索了this site和API,我必须在下面发帖,因为我不相信我不是垃圾邮件发送者(我是一个新成员),以及Google可以想到的这个想法的许多排列。没有。对不起,如果我错过了什么,我真的很想。
  2. 一旦我让对象可以访问该对象,我该如何处理该对象?不是params[:form_object],我猜。
  3. 修改

    非常感谢你的回复,伙计们!对此,我真的非常感激。我吸取了教训,那就是你不应该从表单中深层复制一个对象,并且当你提交表单时,实际上会包含一个表单的参数。

    我会承认,虽然不知道看起来那么明显的东西但是有点令人沮丧......

3 个答案:

答案 0 :(得分:1)

你需要在url中传递“@form_object”的“id”,然后查找该对象(假设你有一个模型并使用ActiveRecord)

答案 1 :(得分:0)

这取决于您如何设置路线。如果您使用默认的/:controller /:action /:id路由,则可以将其作为URL中的参数传递。请注意,不是可以/应该传递整个@form_object,而是使用id或其他属性来识别它。在这种情况下,您应该建立您的网址:

<% form_for @form_object, :url => {:controller => 'application',
                  :action => 'form_action_thing', :email => some_email} do |f| %>
  <%= f.text_field :email %>
  <%= submit_tag 'Login' %>
<% end %>

在您的控制器中

def form_action_thing
  @user = User.find_by_email(params[:email])
end

答案 2 :(得分:0)

您可以通过url传递参数,但是在提交表单时,唯一应该(可能)通过url传递的是RESTful记录的记录ID。

您似乎还没找到params中可以找到表单数据的位置。

所以

  • 表单中的所有数据都应以params[:form_object]结尾。 :form_object的实际值是由Rails选择的,它可能来自对象的类(现在看起来太懒了)
  • 在任何情况下,您都可以通过查看控制台/日志输出轻松找到提交表单值的位置。每个请求的所有参数都被丢弃。
  • 表单字段位于params[:form_object][:email]之类的参数内 - 提交的每个字段都有一个与字段名称对应的条目。
  • params哈希包含@form_object中的所有原始值。只有表格中包含的那些值。
  • 如果您需要使用表单将不可编辑的值传递给控制器​​,请使用hidden_field(s)这些将随表单一起提交,但对用户不可见。
相关问题