рельсы nested_attribute - PullRequest
       7

рельсы nested_attribute

1 голос
/ 13 февраля 2012

Я хочу создать форму комментария внизу записи в блоге.Проблема в том, что он не сохраняет blog_id, поэтому при создании комментария ему не назначается blog_id.Я думал, что с этой строкой:

@new_comment = @blog.comments.build(params[:comment])

, что это будет работать, но это не так.Вот что у меня есть:

blog # show

def show
 @blog = Blog.find(params[:id])
 @new_comment = @blog.comments.build(params[:comment])
end

blog # form

...
<%= semantic_form_for @new_comment do |f| %>
  <%= f.input :name %>
  <%= f.input :content, :label => "Comment", :input_html => { :rows => 6, :class => "xxlarge" } %>
<div class="pull-right"><%= f.commit_button :button_html => {:class => "primary"}, :label => "Submit" %></div>
<% end %>

blog.rb

 accepts_nested_attributes_for :comments

контроллер комментариев

  def create
@comment = @blog.comments.build(params[:comment])
if @comment.save
  redirect_back_or show_blog_path(@blog)
else
  redirect_to show_blog_path(@blog)
end
end

РЕДАКТИРОВАТЬ:

Я вложил форму в @blog, выполнив:

<%= semantic_form_for @blog do |f| %>
<%= f.semantic_fields_for :comments do |ff| %>
  <%= ff.input :name %>
   <%= ff.input :content, :label => "Comment", :input_html => { :rows => 6, :class => "xxlarge" } %>
<% end %>    
<div class="pull-right"><%= f.commit_button :button_html => {:class => "primary"}, :label => "Submit" %></div>
<% end %>

и изменил показ блогов # на:

@blog = Blog.find(params[:id])
@blog.comments.build
@comments = Comment.where(:blog_id => @blog.id)

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

Я не знаю, что это такое.

1 Ответ

1 голос
/ 13 февраля 2012

Вы не ссылаетесь на родительский объект в вашей форме.Да, вы инициализировали @new_comment, который ссылается на текущий @blog, но в форме комментариев это не указано.Если вы проверите параметры, переданные для создания действия контроллера комментариев, вы, скорее всего, не обнаружите, что bold_id передается.

Попробуйте выполнить

f.hidden :blog 

в форме комментария.

Или, если вы не хотите иметь скрытое поле как таковое, тогда вы можете иметь вложенную форму как

semantic_form_for [@blog, @new_comment] do |f|

Но для этого требуется, чтобы в вашем файле маршрутов были пути для комментариев, которые будутвложенный в блоги, что-то вроде (пока что давайте только действие создания)

resources :blogs do
   resources :comments, :only => [:create]
end

Это необходимо, поскольку сообщение формы направлено на blog_comments_path.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ : Вот как я предлагаю его реализовать (мммм, поэтому, пожалуйста, будьте внимательны, если оно удовлетворяет вашим потребностям) -

blogs#show как:

@blog = Blog.find(params[:id])
@now_comment = @blog.comments.build 
@comments = @blog.comments # existing comments u might wanna show below the post

Форма как:

= semantic_form_for [@blog, @new_comment] do |f|
   # input for name and content

Маршруты - вложенные, как показано выше

comments#create как: (blog_id также передается как params. Итак, вы можете найти блог и создатькомментарий, основанный на параметрах комментария для этого блога, а затем сохраните его)

@blog = Blog.find(params[:blog_id])
@comment = @blog.comments.new(params[:comment])
@comment.save
...