Rails: current_user.vote_up (@micropost) неопределенный метод - PullRequest
0 голосов
/ 25 февраля 2012

В настоящее время я получаю неопределенный метод добавления <% if current_user.vote_up?(@micropost) == true %>, я не уверен, что является причиной ошибки, потому что я определил ее здесь, в контроллере микросообщений. Есть предложения?

Контроллер микросообщений

 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

Микросообщение 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 Ответ

2 голосов
/ 25 февраля 2012

Методы контроллера не могут быть вызваны напрямую, как вы собираетесь из представления.

Кроме того, кажется, что существует некоторая путаница в том, как работает разделение MVC в Rails.

Ваша переменная current_user (в представлении) соответствует слою «Модель», и поэтому vote_up? должен быть методом любого экземпляра класса current_user. Это будет определено в models/User.rb или что-то в этом роде, и должен существовать метод vote_up?, который просто запрашивает экземпляр пользователя и возвращает логическое значение.

Это не имеет никакого отношения к действию controller_up контроллера. Это не вернет само значение: я понимаю, что на самом деле нужно проголосовать за «микросообщение». Метод в контроллере будет запущен в ответ на запрос пользователя, сделает некоторые вещи для объектов из базы данных (уровень модели), возможно, поместит некоторые из этих объектов модели в переменные и вызовет представление, чтобы показать информацию пользователю (возможно, взяты из этих объектов). Но методы в контроллерах не должны вызываться из представления.

Между прочим, выполнение == true, как вы делаете в Micropost HTML, является избыточным, как обычно, методы, заканчивающиеся на ?, возвращают логическое значение. Вы можете просто:

<% if current_user.vote_up?(@micropost) %>
...