Ich habe ein vorhandenes Formular, das an ein Modell mit dem Namen "Bestellung" gebunden ist, aber ich möchte neue Formularfelder hinzufügen, in denen Kreditkarteninformationen wie Name, CC-Nummer usw. erfasst werden, die auf einem Zahlungsgateway eines Drittanbieters verarbeitet werden sollen.
Da ich aber keine CC-Informationen in unserer Datenbank speichern möchte, gibt es in meiner Bestellungstabelle keine entsprechenden Spalten davon. Und dies gibt mir einen Fehler beim Senden des Formulars, dass diese Kreditkarten-Eingabefelder nicht Teil des Bestellmodells sind.
ruby-on-rails
simple-form
Zeratool
quelle
quelle
Antworten:
Sie können attr_accessor verwenden
class Order < ActiveRecord::Base attr_accessor :card_number end
Jetzt können Sie
Order.first.card_number = '54421542122'
es in Ihrem Formular tun oder verwenden oder was auch immer Sie sonst noch tun müssen.Hier finden Sie Ruby-Dokumente unter http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor und hier eine nützliche Frage zum Stackoverflow. Was ist attr_accessor in Ruby?
Verwechsle es nicht mit attr_accessible! Unterschied zwischen attr_accessor und attr_accessible
quelle
params.except(:card_number)
in Ihrem Controller verwenden.Wenn ich Ihre Antwort richtig verstehe, wird auf der offiziellen Wiki-Seite hier erklärt, was Sie tun möchten: Erstellen Sie eine gefälschte Eingabe, die KEINE Attribute liest . Sie können nach Edwards Vorschlag ein Feld verwenden, das sich nicht auf eine echte Datenbankspalte bezieht. Sie müssen jedoch kein Attribut in Ihrem Modell definieren, wenn das Formularfeld nichts mit dem Modell zu tun hat.
Zusammenfassend lässt sich sagen, dass der auf der Seite erläuterte Trick darin besteht, eine benutzerdefinierte Eingabe mit dem Namen "FakeInput" zu definieren und wie folgt zu verwenden:
<%= simple_form_for @user do |f| %> <%= f.input :agreement, as: :fake %> ....
Vergessen Sie nicht, Ihren Rails-Server neu zu starten, nachdem Sie eine benutzerdefinierte Eingabe hinzugefügt / geändert haben, wie von Fitter Man kommentiert.
UPDATE: Bitte beachten Sie, dass die offizielle Wiki-Seite aktualisiert wurde und der Beispielcode auf der Wiki-Seite für diejenigen, die ältere Versionen von SimpleForm verwenden, nicht funktioniert. Verwenden Sie stattdessen den folgenden Code, wenn Sie auf einen Fehler wie z
undefined method merge_wrapper_options for...
. Ich benutze 3.0.1 und dieser Code funktioniert gut.class FakeInput < SimpleForm::Inputs::StringInput # This method only create a basic input without reading any value from object def input template.text_field_tag(attribute_name, input_options.delete(:value), input_html_options) end end
quelle
undefined method merge_wrapper_options for #<FakeInput:0x007fbe5e32beb8>
Der beste Weg, um damit umzugehen, ist
simple_fields_for
wie folgt zu verwenden :<%= simple_form_for @user do |f| %> <%= f.input :first_name %> <%= f.input :last_name %> <%= f.input :email %> <%= simple_fields_for :other do |o| %> <%= o.input :change_password, as: :boolean, label: 'I want to change my password' %> <% end %> <% end %>
In diesem Beispiel habe ich ein neues Feld mit dem Namen hinzugefügt,
change_password
das nicht Teil des zugrunde liegendenuser
Modells ist.Der Grund, warum dies ein guter Ansatz ist, besteht darin, dass Sie alle einfachen Formulareingaben / Wrapper als Felder verwenden können. Die Antwort von @baxang ist mir egal, da Sie damit keine verschiedenen Arten von Eingaben verwenden können. Dies scheint flexibler.
Hinweis obwohl für diese Arbeit, ich hatte passieren
:other
zusimple_fields_for
. Sie können eine beliebige Zeichenfolge / ein beliebiges Symbol übergeben , solange es kein Modell mit demselben Namen gibt .Dh leider kann ich nicht bestehen
:user
, da simple_form versuchen würde, ein Benutzermodell zu instanziieren, und wir würden wieder die gleiche Fehlermeldung erhalten ...quelle
Auch wenn Sie nur versuchen, etwas hinzuzufügen und in das zu integrieren
params
, es aber aus dem Hash des Modells herauslassen, können Sie einfach FormTagHelpers ausführen. http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.htmlBeispiel:
<%= simple_form_for resource, :as => resource_name, :url => invitation_path(resource_name), :html => {:method => :post} do |f| %> <%= devise_error_messages! %> <% resource.class.invite_key_fields.each do |field| -%> <%= f.input field %> <%= hidden_field_tag :object_name, @object.class.name %> <%= hidden_field_tag :object_id, @object.id %> <% end -%>
quelle
Ich fand eine sehr einfache (und etwas seltsame) Problemumgehung.
Fügen Sie einfach die
input_html
Option mit einem beliebigenvalue
Schlüssel hinzu. Z.B:= simple_form_for @user do |f| = f.input :whatever, input_html: {value: ''}
Getestet simple_from Versionen: 3.2.1, 3.5.1
quelle