代码之家  ›  专栏  ›  技术社区  ›  kubi

Rails:如何将对象与表单一起发送?

  •  2
  • kubi  · 技术社区  · 15 年前

    我有一个 Post 引用父对象的模型对象。这个 edit , new reply 方法都使用相同的部分模板。

    这个 posts_controller 方法:

    def edit
      @post = Post.find(params[:id])
    end
    
    def reply
      @post = Post.new
      @replypost = Post.find(params[:id])
      @post.title = @replypost.title
      @post.parent = @replypost
    end
    

    部分模板代码:

    <% form_for(@post) do |f| %>
      <%= f.error_messages %>
    
      <p>
        <%= f.label :title %><br />
        <%= f.text_field :title %>
      </p>
      <p>
        <%= f.label :body %><br />
        <%= f.text_area :body %>
      </p>
      <%= if :parent then f.hidden_field :parent end %>
      <p>
        <%= f.submit "Create" %>
      </p>
    <% end %>
    

    如果我查看由部分模板生成的源HTML,我可以看到我正在将某种对象ID传递给我的create方法。

    <input id="post_parent" name="post[parent]" type="hidden" value="#&lt;Post:0x103e3bdf0&gt;" />
    

    问题是,当我尝试保存我创建的这个新对象时,我收到一个警告,说它正在等待一个日志,并得到一个字符串。我确信我可以通过设置和获取家长ID并将其与我的表格一起传递来解决这个问题,但是我想知道是否有更好的方法可以做到这一点,一些更优雅和Rails风格的东西。

    3 回复  |  直到 13 年前
        1
  •  5
  •   Question Mark    15 年前

    尝试 <%= f.hidden_field :parent_id unless @post.parent.nil? %>

    这将通过日志传递父ID,然后您可以 .find(params[:post][:parent_id]) 如果以后需要对象。

        2
  •  2
  •   Eric Hu    13 年前

    对于希望发送对象而不是ID的人(在有未保存的对象时很有用),可以执行以下操作:

    在你看来:

    <% form_for(@post) do |f| %>
      ...
      <%= hidden_field_tag :param_name, @object.to_param %>
    

    在控制器中:

    object = Rack::Utils.parse_nested_query params[:param_name]
    

    适用于嵌套哈希。尚未使用数组或数组散列进行测试。

    在跨多个视图构建一个对象时,我发现这一点是必要的,如果我之前尝试保存的话,这些视图将无法通过验证。

    警告 :用户在中可以看到@object中的数据。 hidden_field_tag . 他们只需要单击“查看源代码”。请仔细考虑使用此方法要序列化的任何对象。

        3
  •  1
  •   Blaine Lafreniere    15 年前

    从外观上看,

    <%= if :parent then f.hidden_field :parent end %>
    

    当您说:父级时,无法推断出您希望隐藏字段的值是父级日志的ID。

    您必须显式使用:parent_id来生成隐藏字段的值,因为它不能像在rails中的其他地方那样被推断出来。