使用Rails通过Ajax更新部分

时间:2013-03-20 04:06:57

标签: jquery ruby-on-rails ruby ajax voting

我正在尝试使用Ajax更新rails部分并遇到一些麻烦。基本上我有一个具有Karma属性的帖子。用户可以投票并投票决定从帖子中删除Karma。我想允许用户使用Ajax异步更新post值,并且我遇到了NilClass错误,我希望你可以帮助我。 我得到的错误是未定义的方法`业力'对于nil:NilClass(在我的_karma_value.erb文件中),我的文件如下所示。我完全卡住了!

posts_controller.rb

   def add_karma
     # Save the page that the request came from
     session[:initial_page] ||= request.referer

     @post = Post.find(params[:id])
     @post.karma = @post.karma + 1
     @post.update_attributes(params[:post])

     respond_to do |format|
       format.html { redirect_to session[:initial_page] }  #redirect back to requesting page
       format.json { head :no_content }
       format.js {}
     end   
   end

add_karma.js.erb

   $('#add_karma').html(
     "<%= escape_javascript(render('_karma_value', post: @post)) %>");

index.html.erb

...
<b>Karma:</b> 
        <%= render(:partial => 'karma_value', :locals => {:post => @post}) %>  <br>
...

_karma_value.erb

<% if !(post.karma.nil?) %>
    <%= post.karma %>
<% end %>

3 个答案:

答案 0 :(得分:1)

是的, @post 在部分内容为零。

因为,在渲染部分时,您已将局部变量发布称为 @post 。但是在部分中使用 @post

只需在该部分中使用发布

_karma_value.html.erb

中的

<% if !(post.karma.nil?) %>
  <%= post.karma %>
<% end %>

答案 1 :(得分:0)

您通过了:locals => {:post => @post},因此您应该在_karma_value.erb partial

中使用post代替@post

答案 2 :(得分:0)

为什么不在render :partial =>add_karma.js.erb使用相同的index.html.erb命令?您似乎无法正确渲染add_karma.js.erb中的部分内容。