Вложенные комментарии с жемчужиной Ajax и Ancestry
Я пытаюсь встроить комментарии в мое приложение Rails 4. Мне удалось получить вложенные комментарии для работы, используя Railcasts 262 в качестве руководства. Я хотел бы, чтобы поле нового комментария появлялось, когда пользователь хочет ответить на комментарий или добавить новый и ограничить время перезагрузки страницы. Я смотрел Railscasts 136 и другие. Я использую драгоценный камень предков и не могу отобразить форму и комментарии по желанию.
Кажется, проблема в том, что когда я отправляю пользователя в new_comment_path, post_id теряется. Мне удалось сохранить его с комментарием, прежде чем добавить Ajax и новый шаг в маршрутах. Раньше я просто отображал форму комментария на странице пост-шоу, и это работало. Теперь новый комментарий сохраняется, но post_id, ancestry_id и parent_id равны нулю. Поэтому я не могу сделать так, чтобы эти комментарии отображались на странице шоу для сообщений. После того, как я заставлю new_comment работать, я также настрою его так, чтобы "ответ" также работал. Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения. Благодарю.
post.rb
class Post < ActiveRecord::Base
belongs_to :user
has_many :comments
comment.rb
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :post
has_ancestry
end
_comment_form.html.erb
<%= form_for @comment, remote: true do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="comment_field">
<%= f.hidden_field :post_id, :value => @comment.post_id %>
<%= f.hidden_field :parent_id, :value => params[:parent_id] %>
<%= f.text_area :content, placeholder: "" %>
</div>
<button class="btn" type="submit">
Send request
</button>
<% end %>
post show.html.erb
... information about post ...
<div id="added_comments">
<%= link_to "New Comment", new_comment_path, id: "new_link", remote: true, :post => @post %>
</div>
<%= nested_comments @post.comments.arrange(:order => :created_at) %>
комментарий new.html.erb
<h1>New Comment</h1>
<%= render 'comment/form' %>
комментарий new.js.erb
$('#new_link').hide().after('<%= j render("form") %>');
create.js.erb
$('#new_comment').remove();
$('#new_link').show();
$('#added_comments').append('<%= j nested_comments (@post.comments).arrange(:order => :created_at) %>');
_comment.html.erb
<%= link_to comment.user.name, comment.user %>
<%= comment.content %>
<%= link_to "Reply", post_path(@post, :parent_id => comment) %>
comments_controller.rb
def new
@comment = Comment.new(:parent_id => params[:parent_id], :post_id => params[:post_id])
end
def create
@comment = Comment.create(comment_params)
@comment.user = current_user
if @comment.save
CommentMailer.comment_confirmation(@comment).deliver
flash[:success] = "Comment added."
respond_to do |format|
format.html { redirect_to :back }
format.js
end
else
flash[:error] = "Comment cannot be blank"
end
end
def show
@comment = Comment.find(params[:id])
@user = @comment.user
end
posts_controller.rb
def show
@post = Post.find(params[:id])
@comment = @post.comments.build(:parent_id => params[:parent_id])
@user = User.find(@post.user_id)
@comment.user_id = current_user
end
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = "Post added!"
redirect_to root_url
else
@repository_items = [ ]
render 'shared/_post_form'
end
end
1 ответ
Ваш шаблон показа сообщений немного неправильный. Когда вы передаете произвольный символ в link_to, он становится атрибутом html в теге link, поэтому при использовании
:post => @post
В вашем HTML, который становится чем-то вроде
post="#<Post:0x007fe26e0907d8>"
который не будет работать для вас, потому что вы хотите передать parent_id и post_id в качестве параметров для нового действия комментария. Вместо этого вы можете попробовать что-то вроде этого
<%= link_to "New Comment", new_comment_path(parent_id: @post.id, post_id: @post.id), id: "new_link", remote: true %>
Затем, когда вы приступите к реализации своего комментария, у вас будет что-то вроде
<%= @post.comments.each do |comment| %>
<%= link_to "Reply to Comment", new_comment_path(parent_id: comment.id, post_id: @post.id), id: "new_link", remote: true %>
<%- end %>
Кроме того, вы, возможно, только что пропустили файлы, но из того, что я вижу, шаблон new.js.erb комментария должен ссылаться на comment_form вместо формы, поскольку именно так вы назвали свой шаблон.