Если вы посмотрите на 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 в ваших взглядах. Как правило, инициализация объекта должна выполняться в контроллере, а представления должны быть ограничены логикой представления.