Rails3 Ассоциации и вложенные атрибуты - PullRequest
0 голосов
/ 15 декабря 2011

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

Модель

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

View

<%= 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

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

1 Ответ

0 голосов
/ 15 декабря 2011

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

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

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

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

Для начала обратитесь к вложенные атрибуты в рельсах .

...