2009-09-16 3 views
0

Я использовал виртуальные атрибуты в прошлом, но, похоже, я не могу пройти мимо этого, и я знаю, что ответ, вероятно, смотрит мне в лицо.проблемы с виртуальными атрибутами с неопределенными методами

У меня есть модель, как так:

модели Confirmation.rb

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 

Ваш средний контроллер эшафот для

confirmations_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 

new.html.erb

<h1>New confirmation</h1> 

<% form_for(@confirmation) do |f| %> 
    <%= f.error_messages %> 

    <%= f.hidden_field :confirmation_token %> 

... 

routes.rb

map.confirmation "confirmation/:confirmation_token", :controller => "confirmations", :action => "new" 
    map.resources :confirmations 

ошибка

неопределенный метод `подтверждение =» # для

В консоли Booking.find_by_confirmation_token (маркера) с данным маркером работает прекрасно.

Любые идеи? предложения?

ответ

2

Я думаю, что это должно быть:

def confirmation_token=(token) 
    @confirmation = Booking.find_by_confirmation_token(token) 
end 

Или вы должны раскомментировать attr_accessible :confirmation или определить #confirmation и #confirmation=.

+0

Это странно. Я пробовал одно и то же однажды раньше ... с @ вместо себя ... и это не сработало. Но на этот раз. Все еще не уверен, что изменилось .. спасибо. – holden

0
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 все еще возвратил undefined метод ...

+0

Мне все равно хотелось бы знать почему? – holden

+2

attr_accessible предназначен только для массового присвоения атрибутами Model #. Он не определяет геттеры/сеттеры. attr_accessor делает это. – Koraktor

+0

ах, отлично. теперь он работает по назначению! – holden

5

Что вам действительно нужно attr_accessor: подтверждение. Существует разница между attr_accessible и attr_accessor.

attr_accessor :confirmation 

такой же, как

def confirmation 
    @confirmation 
end 

def confirmation=(value) 
    @confirmation = value 
end 

Теперь, так как это такая общая картина рубин введены вспомогательные методы для этого.

С другой стороны, Attr_accesible - это метод rails, который отмечает, что некоторые поля могут быть обновлены.

Смежные вопросы