problemas de atributos virtuais com métodos indefinidos
-
07-07-2019 - |
Pergunta
Eu usei atributos virtuais no passado, mas eu não consigo superar isso, e eu sei a resposta é, provavelmente, me olhando na cara.
Eu tenho um modelo assim:
modelo 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
Seu controlador média andaime para
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
Erro
undefined method `confirmação =' for #
No console Booking.find_by_confirmation_token (token) com uma dada obras simbólicas perfeitamente bem.
Todas as idéias? sugestões?
Solução
Eu acho que deveria ser:
def confirmation_token=(token)
@confirmation = Booking.find_by_confirmation_token(token)
end
Ou você deve attr_accessible :confirmation
uncomment ou definir #confirmation
e #confirmation=
.
Outras dicas
O que você realmente precisa é attr_accessor: confirmação. Há uma diferença entre attr_accessible e attr_accessor.
attr_accessor :confirmation
é o mesmo que
def confirmation
@confirmation
end
def confirmation=(value)
@confirmation = value
end
métodos auxiliares Agora, já que ele é um padrão tão comum rubi introduzidas para isso.
Attr_accesible por outro lado é trilhos método, que marcas que certos campos podem ser massa atualizado.
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
isso funcionou ... no entanto apenas descobrindo a attr_accessible: confirmação, não. self.confirmation método indefinido ainda voltou ...