我创建了一个简单的投票部分,但由于这个原因它没有更新:
错误
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%>
答案 0 :(得分:1)
$("#vote_<%=scribble.id%>")
VS
$("#vote_<%=@scribble.id%>")
您已将@scribble
设置为不是名为scribble
的本地变种
@scribble
和scribble
不是一回事。
如果你从来没有为一个名为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
,并且在当前请求周期内可用于所有视图/部分。