problèmes d'attributs virtuels avec des méthodes non définies
-
07-07-2019 - |
Question
J'ai utilisé des attributs virtuels dans le passé, mais je n'arrive pas à surmonter ce problème et je sais que la réponse est sans doute en train de me regarder dans les yeux.
J'ai un modèle comme celui-ci:
confirmation du modèle.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
Votre contrôleur d'échafaudage moyen pour
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
erreur
Méthode non définie `confirmation = 'pour #
Dans la console, Booking.find_by_confirmation_token (jeton) avec un jeton donné fonctionne parfaitement.
Des idées? suggestions?
La solution
Je pense que cela devrait être soit:
def confirmation_token=(token)
@confirmation = Booking.find_by_confirmation_token(token)
end
Ou vous devriez supprimer les commentaires attr_accessible: confirmation
ou définir #confirmation
et #confirmation =
.
Autres conseils
Ce dont vous avez vraiment besoin, c'est attr_accessor: confirmation. Il y a une différence entre attr_accessible et attr_accessor.
attr_accessor :confirmation
est identique à
def confirmation
@confirmation
end
def confirmation=(value)
@confirmation = value
end
Maintenant que c'est un motif si courant, Ruby a introduit des méthodes d'assistance pour cela.
Attr_accesible, d’autre part, est la méthode rails, qui indique que certains champs peuvent être mis à jour en masse.
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
cela a fonctionné ... cependant, il suffit de découvrir l'attr_accessible: confirmation, n'a pas. self.confirmation renvoyait toujours la méthode non définie ...