Rails Ajax渲染部分带有id

时间:2014-06-27 01:32:54

标签: javascript ruby-on-rails ajax ruby-on-rails-3

我创建了一个简单的投票部分,但由于这个原因它没有更新:

错误

NameError - undefined local variable or method `scribble' for 
  app/views/scribbles/vote.js.erb:1:in `_app_views_scribbles_vote_js_erb

唯一的投票方法没有任何问题,但由于上述错误,它只是在视图中无法更新。我想我只需要知道如何将 scribble 对象传递给vote.js.erb ???

_vote.html.erb

<%if current_user.voted_for?(scribble)%>
<a href="" id="vote_<%=scribble.id%>" name="promote" class="votes">
<div class="scribblevote"> 
    <i class="fa fa-cloud-upload"></i>  
    <%=scribble.votes.count%> <%= link_to "demote", vote_scribble_path(:id => scribble.id, :vote => false), remote: true, method: :post%> 
    </div></a>
<%else%>
<a href="" id="vote_<%=scribble.id%>" name="promote" class="votes">
<div class="scribblevote"> 
    <i class="fa fa-cloud-upload"></i>  
    <%=scribble.votes.count%> <%= link_to "promote", vote_scribble_path(:id => scribble.id, :vote => true), remote: true, method: :post%> 
    </div></a>
<%end%>

vote.js.erb

   $("#vote_<%=scribble.id%>").html("<%= escape_javascript( render(:partial => "scribbles/vote") ) %>");

控制器方法

  def vote
  @scribble = Scribble.find(params[:scribble_id])
  @vote = params[:vote]
  if @vote == "true"
    @v = :up
  else
    @v = :down
    current_user.unvote_for(@scribble)
  end
  current_user.vote(@scribble, :direction => @v)
    respond_to do |format|
      format.js{}
    end

scribble / _scribbles.html.erb

 <% @scribbles.each do |scribble| %>
 <%= render :partial=> "scribbles/vote", :locals => {scribble:  scribble}%>
 <%end%>

2 个答案:

答案 0 :(得分:1)

$("#vote_<%=scribble.id%>")

VS

$("#vote_<%=@scribble.id%>")

您已将@scribble设置为不是名为scribble的本地变种

@scribblescribble不是一回事。

如果你从来没有为一个名为scribble的东西赋值 - 那么它就不存在......如果你试图在任何地方使用......那么它会爆炸并告诉你它没有存在。

除非您故意设置名为@scribble

的局部变量,否则您需要在任何地方使用scribble

例如:

  <%= render :partial=> "scribbles/vote", :locals => {scribble: @scribble}%>

请注意。在代码中,您使用名为@scribble的变量,并设置一个局部变量(称为scribble)以供部分使用。

部分人现在可以访问scribble

答案 1 :(得分:0)

您可以将本地传递给部分,如下所示:

render(partial: 'path_to_partial', locals: { var_in_partial: var_in_current_scope })

因此...

render(partial: 'scribbles/vote', locals: { scribble: scribble })

它会在scribble部分中被称为_vote,我们将从当前范围传入scribble

或者,您可以使用控制器中定义的@scribble,并且在当前请求周期内可用于所有视图/部分。