在js.erb文件中渲染部分对象

时间:2016-08-11 07:59:21

标签: javascript ruby-on-rails ajax

这是我发表评论的索引/帖子

<% @posts = Post.where(user_id: current_user.all_user_ids).order("created_at desc") %>

<%@posts.each do |post| %>
  <div id="comment-action">
    <button id="<%= "#{post.id}" %>"> View comment</button>
    <%= link_to "View Comments", "#post_comments_#{post.id}" %>

    <section class="comments-section" id="post_comments_<%= post.id %>" >
      <br>
      <div id="comments">
        <%= render 'commenters/newsfeedcomment', obj: post  %>
      </div>

      <% if current_user == post.user %>
        <h6 align="right"><%= link_to 'Edit', edit_post_path(post) %></h6>
        <h6 align="right"><%= link_to 'Delete', { :id => post ,:controller => 'posts',:action => 'destroy'} %></h6>
      <% end %>
    </section>                    
  </div>    
<% end %>

现在我将一个对象传递给我的_newsfeedcomment,即obj:post

继承我的newsfeedcomment

<% obj.commenters.each do |c| %>
  <li class = 'comments'>
    <br><%= image_tag c.user.profile.avatar.url, size:"50x50" %> 
    <a href="<%= "#{profile_path(c.user.profile)}" %>">
    <%= c.user.profile.firstname + " " + c.user.profile.lastname %></a> : <%=   c.comment %>
    <br><%= time_ago_in_words(c.created_at) %> ago
  </li>

  <% if current_user == c.user %>
    <%= link_to "Delete comment", [c.post, c], method: :delete %>
    <%= link_to "Edit comment", edit_post_commenter_path(c.post, c) %>
  <% end %>
<% end %>

我想再次为我的ajax

呈现我的newsfeedcomment
$('#comments').append("<%= j render(:partial => 'commenters/nesfeedcomment', obj: post) %>");

这是我的错误

  

未定义的局部变量或方法`post&#39;对于#&lt;#:0x007f8660e313e8&gt;

我猜导轨无法读取我的物体?有没有办法,所以我可以完成我的项目请有人帮助我...

继承我的控制器

def create
@comment = @post.commenters.create(params[:commenter].permit(:comment))
@comment.user_id = current_user.id
@comment.save

if @comment.save
  respond_to do |format|
  format.html {redirect_to posts_path}
  format.js
  end
else
  redirect_to posts_path
end

2 个答案:

答案 0 :(得分:1)

<%= render 'commenters/newsfeedcomment', obj: post %>

此代码适用于index.html,因为post只是来自@posts的循环对象

更新: 感谢您使用控制器进行更新。 您要做的是为.js的{​​{1}}行动提供comments_controller格式回复。

这可以通过提供呈现视图create

来完成

app/views/comments/create.js.erb中,只需:

create.js.erb

$('#comments').append("<%= j render(:partial => 'commenters/nesfeedcomment', obj: @post) %>");

就是这样。

你缺少的只是你的块中$('#comments').append("<%= j render(:partial => 'commenters/nesfeedcomment', obj: @comment.post) %>");的定义,因为它没有被赋值为变量,而ruby将它解释为对某个方法post的调用 - 因此你的错误消息:post

答案 1 :(得分:0)

我创建了另一个渲染文件,就像newsfeedcomment

一样

评论者/ commentlist.html.erb

    <li class = 'comments'>
<br><%= image_tag @comment.user.profile.avatar.url, size:"50x50" %> 
<a href="<%= "#{profile_path(@comment.user.profile)}" %>">
<%= @comment.user.profile.firstname + " " + @comment.user.profile.lastname %></a> : <%= @comment.comment %>

<br><%= time_ago_in_words(@comment.created_at) %> ago

<% if current_user == @comment.user %>
        <%= link_to "Delete comment", [@comment.post, @comment], method: :delete %>
        <%= link_to "Edit comment", edit_post_commenter_path(@comment.post, @comment) %>
    <% end %>
</li>

这是我的create.js.erb

var content = "<%= j render(:partial => 'commenters/commentlist', obj: @comment) %>";

var $post = $("#post_comments_<%= @comment.post_id %>");
var $last_comment = $post.find('#comments > li:last');

if ($last_comment.length > 0) {
$last_comment.after(content);
} else { 
var $comments = $post.find('#comments');
$comments.prepend(content)          
}