2013-12-17 2 views
1

Я пытаюсь создать комментарии в своем приложении Rails 4. Мне удалось получить вложенные комментарии для работы с использованием Railcasts 262 в качестве руководства. Я хочу, чтобы появилось новое поле комментария, когда пользователь хочет ответить на комментарий или добавить новый и ограничить время перезагрузки страницы. Я просмотрел Railscasts 136 и другие. Я использую родословную и не могу получить форму и комментарии, чтобы показать их по желанию.Вложенные комментарии с Ajax и Ancestry gem

Проблема заключается в том, что когда я отправляю пользователя на новый_комментарий, 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 %> 

сообщение 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 

ответ

0

Ваши сообщения показывают шаблон немного неправильно. Когда вы передаете произвольный символ LINK_TO он становится атрибутом HTML на теге ссылки поэтому при использовании

: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 должен ссылаться на комментарий_form вместо формы, поскольку это то, что вы назвали своим шаблоном

Смежные вопросы