problemi di attributo virtuale con metodi non definiti
-
07-07-2019 - |
Domanda
Ho usato gli attributi virtuali in passato ma non riesco a superarlo, e so che probabilmente la risposta mi sta fissando in faccia.
Ho un modello così:
modello 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
Il controller dell'impalcatura medio per
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
Errore
metodo non definito `confirm = 'per #
Nella console Booking.find_by_confirmation_token (token) con un determinato token funziona perfettamente.
Qualche idea? suggerimenti?
Soluzione
Penso che dovrebbe essere:
def confirmation_token=(token)
@confirmation = Booking.find_by_confirmation_token(token)
end
Oppure dovresti decommentare attr_accessible: conferma
o definire #confirmation
e # confirm =
.
Altri suggerimenti
Ciò di cui hai veramente bisogno è attr_accessor: conferma. C'è una differenza tra attr_accessible e attr_accessor.
attr_accessor :confirmation
è uguale a
def confirmation
@confirmation
end
def confirmation=(value)
@confirmation = value
end
Ora, poiché è un modello così comune, il rubino ha introdotto metodi di supporto per questo.
Attr_accesible d'altra parte è il metodo rails, che segna che alcuni campi possono essere aggiornati in massa.
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
questo ha funzionato ... comunque solo scoprire l'attr_accessible: conferma, no. la conferma automatica ha comunque restituito un metodo indefinito ...