проблемы с виртуальными атрибутами с неопределенными методами
-
07-07-2019 - |
Вопрос
Раньше я использовал виртуальные атрибуты, но, похоже, не могу пройти мимо этого и знаю, что ответ, вероятно, смотрит мне в лицо.
У меня есть такая модель:
Подтверждение модели.рб
class Confirmation < ActiveRecord::Base
#attr_accessible :confirmation, :confirmation_token
#attr_accessible :confirmation_token
def confirmation_token
confirmation.confirmation_token if confirmation
end
def confirmation_token=(token)
self.confirmation = Booking.find_by_confirmation_token(token)
end
end
Ваш средний контроллер лесов для
подтверждения_controller.rb
def new
@confirmation = Confirmation.new(:confirmation_token => params[:confirmation_token])
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @confirmation }
end
end
новый.html.erb
<h1>New confirmation</h1>
<% form_for(@confirmation) do |f| %>
<%= f.error_messages %>
<%= f.hidden_field :confirmation_token %>
...
маршруты.рб
map.confirmation "confirmation/:confirmation_token", :controller => "confirmations", :action => "new"
map.resources :confirmations
ошибка
неопределенный метод `confirmation=' для #
В консоли Booking.find_by_confirmation_token(token) с заданным токеном работает отлично.
Есть идеи?предложения?
Решение
Я думаю, что это должно быть либо:
def confirmation_token=(token)
@confirmation = Booking.find_by_confirmation_token(token)
end
Или вы должны раскомментировать attr_accessible: подтверждение
или определить #confirmation
и #confirmation =
.
Другие советы
Что вам действительно нужно, так это attr_accessor :confirmation.Есть разница между attr_accessible и attr_accessor.
attr_accessor :confirmation
то же самое, что и
def confirmation
@confirmation
end
def confirmation=(value)
@confirmation = value
end
Поскольку это такой распространенный шаблон, Ruby ввел для этого вспомогательные методы.
Attr_accessible, с другой стороны, — это метод рельсов, который отмечает, что определенные поля могут быть массово обновлены.
class Confirmation < ActiveRecord::Base
belongs_to :bookings
#attr_accessible :confirmation, :confirmation_token
#attr_accessible :confirmation
def confirmation_token
@confirmation.confirmation_token if @confirmation
end
def confirmation_token=(token)
@confirmation = Booking.find_by_confirmation_token(token)
end
end
это сработало ... однако просто раскрыло attr_accessible: подтверждение, нет. self.confirmation по-прежнему возвращает неопределенный метод ...