Метод, определенный в контроллере, вызывающем NoMethodError

В моем приложении есть Dwellings и Roomies. Я создаю некоторую аутентификацию в представлении Dwelling — только users, которые являются roomies текущими dwelling, должны иметь возможность просматривать определенные данные — все остальные пользователи увидят другое представление.

Чтобы включить это, я создал метод is_roomie? в файле Users Controller. Метод выглядит следующим образом:

## is_roomie? method in Users_Controller.rb ##

def is_roomie?
roomie_ids = []
@dwelling.roomies.each do |r|
  roomies_ids << r.id
end
roomie_ids.include?(current_user.id)
end 

Я вызываю этот метод в представлении Dwelling следующим образом:

## show.html.erb (Dwelling) ##
....
<% if current_user && current_user.is_roomie? %>
....

Когда я загрузил страницу после реализации этого, я получаю следующий NoMethoderror:

NoMethodError в жилищах#show

Показ >/Volumes/UserData/Users/jraczak/Desktop/Everything/rails_projects/Roomie/roomie/app/views/dwellings/show.html.erb, где строка № 5 поднята:

неопределенный метод `is_roomie?' для #Пользователь:0x00000102db4608>

Для некоторого фона я попробовал это как метод Dwelling и переместил его в модель User безрезультатно. Заранее спасибо за любую информацию!


person justinraczak    schedule 10.11.2012    source источник


Ответы (2)


current_user — это объект User, а не объект UsersController, поэтому вы не можете вызвать метод, определенный для этого объекта. Когда вы подумаете об этом в этом контексте, вы увидите, что вы должны определить этот метод на User.

Попробуйте что-то подобное в app/model/user.rb:

class User < ActiveRecord::Base
  # ...
  def roomie?(dwelling)
    dwelling.roomies.include?(self)
  end
end

Однако, глядя на это, мы можем улучшить код, переместив его в класс Dwelling в app/models/dwelling.rb:

class Dwelling < ActiveRecord::Base
  # ...
  def roomie?(user)
    roomies.include?(user)
  end
end

Затем вы должны использовать это в представлении с помощью:

<% if current_user && @dwelling.roomie?(current_user) %>
person Brian Rose    schedule 10.11.2012
comment
Это работает блестяще. Я не скажу, что полностью понимаю фактическую проблему, описанную в первом абзаце, а именно, я не понимаю, что такое объект UsersController, но я попытаюсь прочитать об этом. Спасибо, что устранили мой блокпост. - person justinraczak; 11.11.2012
comment
В верхней части файла users_controller.rb вы увидите, что контроллер определен как class UsersController < ApplicationController. В этом определении класса мы определяем множество методов, таких как index, show и т. д. Эти методы являются методами экземпляра. Когда Rails направляет запрос UsersController, он создает новый экземпляр этого класса. Поскольку вы определили is_roomie? в классе UsersController, это был метод экземпляра в экземплярах UsersController, но не User. - person Brian Rose; 11.11.2012

Объект current_user не имеет метода is_roomie?. Это метод в вашем контроллере. Вы можете вызвать метод в своем действии show и сделать его доступным для представления следующим образом:

#in UsersController.rb
def show
  @is_roomie = is_roomie?
end
person awenkhh    schedule 10.11.2012