【问题标题】:Rails Ajax render of partial with idRails Ajax 渲染带有 id 的部分
【发布时间】:2014-06-27 01:32:54
【问题描述】:

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

错误

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%>

【问题讨论】:

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


    【解决方案1】:
    $("#vote_<%=scribble.id%>")
    

    对

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

    您设置了 @scribble 而不是名为 scribble 的本地变量

    @scribble 和 scribble 不是一回事。

    如果您从未为名为@9​​87654327@ 的东西赋值 - 那么它不存在...如果您尝试在任何地方使用... 那么它会爆炸并告诉您它不存在。

    您需要在任何地方使用@scribble,除非您故意设置一个名为scribble 的局部变量

    例如:

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

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

    部分现在可以访问scribble

    【讨论】:

    • 同样,然后将 @scribble 变量传递给部分变量,以便可以将其作为局部变量引用 - 部分变量永远不应使用实例变量。
    • 我尝试了两种方法,仍然有效,这就是我所说的部分: "scribbles/vote", :locals => {scribble: scribble}%>我明白了
    • 我猜你是对的,这可能是因为我将实例变量传递给部分。但我这样做是因为我在循环 "scribbles/vote", :locals => {scribble: scribble}%> 有什么想法吗?
    • 循环在哪里与您在问题中发布的代码相关联?您对单个涂鸦有一个投票操作...
    • 你也必须使用@scribble,而不是scribble。
    【解决方案2】:

    您可以像这样将局部变量传递给局部变量:

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

    所以...

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

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

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

    【讨论】:

    • 这是部分调用 "scribbles/vote", :locals => {scribble: scribble}%> 并显示所有对象。但是 vote.js.erb 没有得到 scribble 对象
    • 我不能真正使用 scribble 因为
    • 在 Vote.html.erb 中仅涂鸦有效,在 vote.js.erb 中均无效;/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2018-05-10
    • 1970-01-01
    • 2012-02-18
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多