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?

Était-ce utile?

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 ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top