Rails:current_user.vote_up(@micropost)未定义的方法

时间:2012-02-24 20:40:27

标签: ruby-on-rails ruby ruby-on-rails-3 rating voting

我目前正在获取一个未定义的方法来添加<% 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 %>

1 个答案:

答案 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) %>