Построение сложных форм и отношений - PullRequest
1 голос
/ 07 марта 2011

Модель поста

class Post < ActiveRecord::Base

  attr_accessible :user_id, :title, :cached_slug, :content
  belongs_to :user
  has_many :lineitems


  def lineitem_attributes=(lineitem_attributes)
    lineitem_attributes.each do |attributes|
      lineitems.build(attributes)
    end
  end

Просмотр поста:

<% form_for @post do |f| %>
  <%= f.error_messages %>
  <p> 
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>
  <p> 
    <%= f.label :cached_slug %><br />
    <%= f.text_field :cached_slug %>
  </p>
  <p> 
    <%= f.label :content %><br />
    <%= f.text_area :content, :rows => 3 %>
  </p>
  <% for lineitem in @post.lineitems %>
    <% fields_for "post[lineitem_attributes][]", lineitem do |lineitem_form| %>
    <p> 
      Step: <%= lineitem_form.text_field :step %>
    </p>
    <% end %>
  <% end %>
  <p><%= f.submit %></p>
<% end %>

С контроллера

 12   def new
 13     @user = current_user
 14     @post = @user.posts.build(params[:post])
 15     3.times {@post.lineitems.build}
 16   end
 17 
 18   def create
 19     debugger
 20     @user = current_user
 21     @post = @user.posts.build(params[:post])
 22     if @post.save
 23       flash[:notice] = "Successfully created post."
 24       redirect_to @post
 25     else
 26       render :action => 'new'
 27     end
 28   end

В настоящее время я играю с некоторым кодом и смотрю Railscasts.Мне 73 года, и у меня есть вопрос о сохранении этой формы.

Я вставил некоторый код, и, следуя railscasts 73 .Мой код немного отличается примерно в строке с 20 по 23 в отношении другого отношения после публикации.Используя отладчик, @post имеет только user_id и значения post.params содержит lineitem_attributes.Элементы строки не сохраняются.

Как создать пост, включая элементы строки?

1 Ответ

1 голос
/ 07 марта 2011

Многие из ранних железнодорожных передач уже устарели.Стандартный способ сделать это в наши дни - использовать вложенные атрибуты.По этой теме есть Railscast из двух частей: Часть 1 и Часть 2 .Я не могу добавить, что скринкасты не охватывают, за исключением того, что ваш код будет намного проще:

class Post < ActiveRecord::Base

  attr_accessible :user_id, :title, :cached_slug, :content
  belongs_to :user
  has_many :lineitems

  accepts_nested_attributes_for :lineitems
end

Я не помню, как это работает с защищенными атрибутами, но вынеобходимо добавить: lineitems_attributes к attr_accessible

...