Domanda

Sulla mia pagina dei pagamenti ci sono alcune variabili come card_number che voglio passare dalla vista al modello, ma non voglio per memorizzarli nel db. Posso solito facilmente raggiungere questo semplicemente usando attr_accessor ma in questo caso il modello viene passato in params attraverso accepts_nested_attributes_for e per qualche motivo i params non vengono passati attraverso:

in User.rb devo

  has_many :credit_cards

  accepts_nested_attributes_for :credit_cards

nel file di vista ho un campo formato nidificato, qualcosa come:

  blah blah
  <h2>Credit card</h2>
  <%= f.fields_for :credit_cards do |builder| %>
    <%= render "credit_card_fields", :f => builder %>
  <% end %>

  inside that
  <p>
    <%= f.label :test %><br />
    <%= f.text_field :test %>
  </p>

ora di nuovo in credit_card.rb ho:

attr_accessor :test

before_create :show_me_test_param

private

def show_me_test_param
  raise "#{test}"
end

Ora, la cosa strana è che quando cerco di salvare un record, restituisce semplicemente un'eccezione vuota. Il param non sembra essere stato attraversato da utente a CreditCard attraverso accepts_nested_attributes_for?

Il param viene passata in è:

{"email"=>"name@example.com", "password"=>"pass123", "password_confirmation"=>"pass123", "credit_cards_attributes"=>{"0"=>{"test"=>"helllo this is the second attempt", "name_on_card"=>"first lastname", "card_number"=>"987498742897", "card_verification_value"=>"232", "expiry_date"=>"2141"}}}

La cosa qualcuno sa succedendo? Fa accepts_nested_attributes_for lavoro con attr_accessor?

È stato utile?

Soluzione

Questo mi ha incasinato diverse volte in passato! Params per gli oggetti nidificati vengono al controller con il model_name_attributes chiave che viene passata al nuovo o update_attributes il metodo del modello nel controller.

Quindi è necessario aggiungere al vostro :credit_card_attributes attr_accessor per consentire che la chiave per essere passato in.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top