2011-12-15 2 views
0

У меня возникают проблемы при создании/создании 2 объектов одновременно и их объединении друг с другом. В настоящее время я делаю это «хакерским» способом, не используя вложенные формы и просто передавая параметры для обоих объектов отдельно (из представления.) Затем я соединяю их в контроллере, вот мой код:Rails3 Ассоциации и вложенные атрибуты

Модели

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 

Так что, когда пользователь делает сообщение, они могут прикрепить к нему сообщение «продукт», если захотят. Текущий способ, которым я занимаюсь, имеет большой смысл. Когда я смотрел на учебники с вложенными формами и рассматривал их с помощью методов построения, я начинаю немного смущаться относительно того, что происходит. Можете ли вы помочь мне понять лучший способ связывания этих двух объектов при создании? Лучше всего использовать вложенные поля формы? Я чувствую, что нынешний путь, который я делаю, не так эффективен, как должен.

ответ

0

Да, вы должны использовать вложенные формы. Есть причина, почему они были построены. Они облегчают процесс управления ассоциациями и создают вложенные объекты за один проход.

Метод build создает объект (он вызывает метод .new() для объекта), а затем вы можете его использовать.

Советую вам начать с простого примера вложенных форм и поиграть с ним в течение часа или двух. Таким образом, вы сможете лучше понять, что происходит внизу.

Я думаю, в этом случае самообучение, играя, поможет вам много, вместо того, чтобы кто-то просто сказал вам, почему вложенные формы лучше.

Чтобы начать работать, см. nested-attributes-in-rails.

+0

спасибо! Перейдя через это снова и используя метод build_association, я обнаружил свою критическую ошибку, у меня был внешний ключ в неправильной таблице doh! – yoshyosh

Смежные вопросы