我目前正在获取一个未定义的方法来添加<% if current_user.vote_up?(@micropost) == true %>
,我不确定是什么原因导致错误,因为我在微博控制器中定义了它。有什么建议吗?
Micropost Controller
def vote_up
@micropost = Micropost.find(params[:id])
current_user.vote_exclusively_for(@micropost)
current_user.vote_up(@micropost)
respond_to do |format|
format.html { redirect_to :back }
format.js
end
end
def unvote
@micropost = Micropost.find(params[:id])
current_user.vote_exclusively_against(@micropost)
current_user.unvote(@thred)
respond_to do |format|
format.html { redirect_to :back }
format.js
end
end
Micropost HTML
<% if current_user.vote_up?(@micropost) == true %>
<div class='<%=micropost.id %>'>
<a href="/microposts/<%=micropost.id %>/vote_up" data-remote='true' class='CounterButton b2'>
<span id="CounterIcon" class="<%=micropost.id%>"></span>
</a>
</div>
<% else %>
<div class='<%=micropost.id %>'>
<a href="/microposts/<%=micropost.id %>/unvote" data-remote='true' class='CounterButton b2'>
<span id="CounterIcon" class="<%=micropost.id%>"></span>
</a>
</div>
<% end %>
答案 0 :(得分:2)
无法直接从视图中调用控制器方法。
此外,关于MVC分离在Rails中如何工作似乎有些混乱。
您的current_user变量(在视图中)对应于“模型”图层,因此vote_up?
应该是current_user类的实例的方法。这将在models/User.rb
或类似的内容中定义,并且应该有vote_up?
方法只查询用户的实例并返回布尔值。
这与控制器的vote_up操作无关。这本身不会返回一个值:我理解为实际投票“微博”。控制器中的方法将响应用户的请求而被触发,对数据库(模型层)中的对象执行一些操作,可能将这些模型对象中的一些放入变量中,并调用视图以向用户显示信息(可能取自这些对象)。但控制器中的方法并不意味着从视图中“调用”。
顺便说一句,按照惯例,像在Micropost HTML中那样执行== true
是多余的,以?
结尾的方法会返回一个布尔值。你可以:
<% if current_user.vote_up?(@micropost) %>