Rails3关联和嵌套属性

时间:2011-12-15 07:04:57

标签: ruby-on-rails-3 associations nested-attributes

我遇到了一次保存/创建2个对象并将它们相互关联的问题。目前我通过不使用嵌套表单并且只是单独传递两个对象的参数(从视图中)以“hackish”方式进行。然后我在控制器中连接它们这里是我的代码:

模型

class Post < ActiveRecord::Base
    belongs_to :user
    has_one :product
    accepts_nested_attributes_for :product, :allow_destroy => true
end

class Product < ActiveRecord::Base
    belongs_to :user
    belongs_to :post
end

查看

<%= form_for(@post) do |f| %>
        <div id="post_field">
            <%= f.text_area :content %>
        </div>
        <div id="post_link_previewer" class="clearfix">
        <%= fields_for :product do |prod| %>
            <%= prod.text_field :name %><br />
            <%= prod.text_area :description, :rows => 2 %><br />
            <%= prod.text_field :image_url %><br />
            <%= prod.text_field :original_url %>
        <% end %>
        </div>
        <div id="submit" class="clearfix">
            <%= f.submit "Post" %>
        </div>
        <% end %>

PostsController

  def create
    @user = current_user
    @post = @user.posts.create(params[:post])
    @product = Product.create(params[:product])
    @post.product_id = @product.id

    respond_to do |format|
      if @post.save
        format.html { redirect_to(root_path, :notice => 'Post was successfully created.') }
        format.xml  { render :xml => @post, :status => :created, :location => @post }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end

因此,当用户发帖时,他们可以根据需要将“产品”附加到该帖子。我现在这样做的方式很有意义。当我查看嵌套表单教程并使用构建方法查看它们时,我开始对发生了什么感到困惑。你能帮我理解在创建时链接这两个对象的最佳方法吗?是否最好使用嵌套表单字段?我觉得我现在这样做的方式并不像应该的那样有效。

1 个答案:

答案 0 :(得分:0)

是的,你应该使用嵌套表格。他们为什么建造起来是有原因的。它们简化了管理关联和一次创建嵌套对象的过程。

build方法构建一个对象(它调用对象的.new()方法),然后就可以使用它了。

我建议你从一个简单的嵌套表格示例开始,然后玩一两个小时。通过这种方式,您可以更好地了解下面发生的事情。

我认为,在这种情况下,通过游戏进行自学可以帮助你很多,而不是只是告诉你为什么嵌套表格更好。

要开始使用,请参阅nested-attributes-in-rails