rails-3, новая форма комментария от полиморфной ассоциации, принимает отправку формы, но не отображает поданные данные - PullRequest
1 голос
/ 16 февраля 2011

У меня есть модель полиморфных комментариев и на show.html.erb для posts_controller, у меня есть ссылка «Добавить комментарии», где вы можете нажать, чтобы прокомментировать сообщение. Когда вы нажимаете ссылку, появляется «новая форма комментария», но когда вы отправляете форму, комментарий не отображается и не отображается нигде в приложении. Вот суть некоторых файлов представления и контроллеров: https://gist.github.com/828400 и вот модель, schema.rb и файл журнала: https://gist.github.com/828447, спасибо.

1 Ответ

1 голос
/ 18 февраля 2011

Если вы посмотрите на app / views / comments / _form.html.erb , вы заметите, что это строит форму используя

[@post, Comment.new]

Это означает, что он работает правильно, когда вы создаете комментарий непосредственно из PostsController смотреть как @ post установлено правильно. Это означает, что форма строитель устанавливает действие формы на / posts / 5 / comments (где 5 взято из @ post.id), таким образом устанавливая параметр post_id, который комментирует Комментарии ищет в CommentsController # get_parent.

Однако, когда вы нажимаете «Добавить комментарий» или «Добавить ответ», вы находитесь в CommentsController, который устанавливает переменную с именем @parent. Тот означает, что построитель формы устанавливает для формы действие / comments (поскольку @post равен nil), что означает, что при отправке формы и post_id, и Параметры comment_id равны нулю.

Что это означает, что он достигает этой строки в CommentsController # get_parent:

<code>
redirect_to root_path unless defined?(@parent)

, что означает, что содержимое вашей формы молча отбрасывается.

Самый простой способ заставить формы работать правильно, это сделать следующие изменения:


#app/controllers/posts_controller.rb:

def show
-    @post = Post.find(params[:id])
+    @parent = @post = Post.find(params[:id])
end

#app/views/comments/_form.html.erb b/app/views/comments/_form.html.erb

-  
+  

Как вы увидите, это означает, что форма ищет объект @parent (вместо @post), который затем устанавливается в PostsController & CommentsController.

Кроме того, вы можете внести следующие изменения, чтобы ужесточить свой код:


-  redirect_to root_path unless defined?(@parent)
+  redirect_to root_path unless @parent

Если @parent не определен, он вернет nil, что считается ложным.


-  return @post if defined?(@post)
-  @post = commentable.is_a?(Post) ? commentable : commentable.post
+  @post ||= commentable.is_a?(Post) ? commentable : commentable.post

Кроме того, вы вызываете Comment.new в ваших взглядах. Как правило, инициализация объекта должна выполняться в контроллере, а представления должны быть ограничены логикой представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...