webentwicklung-frage-antwort-db.com.de

rails simple_form Felder, die sich nicht auf das Modell beziehen

Ich habe ein vorhandenes Formular, das an ein Modell mit dem Namen "Bestellung" gebunden ist, möchte jedoch 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 jedoch keine CC-Informationen in unserer Datenbank speichern möchte, enthält meine Bestellungstabelle keine entsprechenden Spalten. Und dies gibt mir einen Fehler, wenn ich das Formular abschicke, dass diese Kreditkarten-Eingabefelder nicht Teil des Bestellmodells sind.

70
zeratool

Sie können attr_accessor verwenden

 class Order < ActiveRecord::Base

   attr_accessor :card_number


 end

Jetzt kannst du Order.first.card_number = '54421542122' oder verwenden Sie es in Ihrem Formular oder was Sie sonst noch tun müssen.

Siehe hier für Ruby docs http://www.Ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor und hier für eine nützliche Frage zum Stackoverflow Was ist attr_accessor in Ruby?

Verwechsle es nicht mit attr_accessible! nterschied zwischen attr_accessor und attr_accessible

40
Edward

Wenn ich Ihre Antwort richtig verstehe, wird auf der offiziellen Wiki-Seite hier erklärt, was Sie tun möchten: Erstellen Sie eine falsche Eingabe, die KEINE Attribute liest . Sie können nach Edwards Vorschlag ein Feld verwenden, das mit keiner realen Datenbankspalte in Beziehung steht. 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 nach dem Hinzufügen/Ändern einer benutzerdefinierten Eingabe, wie von Fitter Man kommentiert, neu zu starten.

UPDATE: Bitte beachten Sie, dass die offizielle Wiki-Seite wurde aktualisiert und der Beispielcode auf der Wiki-Seite nicht für diejenigen funktioniert, die Verwenden Sie ältere Versionen von SimpleForm. Verwenden Sie stattdessen den folgenden Code, wenn Sie auf einen Fehler wie undefined method merge_wrapper_options for... Stoßen. 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
47
baxang

Der beste Weg, dies zu handhaben, ist die Verwendung von simple_fields_for Wie folgt:

<%= 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 change_password Hinzugefügt, das nicht Teil des zugrunde liegenden user-Modells ist.

Dies ist ein guter Ansatz, da Sie damit alle einfachen Formulareingaben/-wrapper als Felder verwenden können. Ich interessiere mich nicht für die Antwort von @baxang, weil es Ihnen nicht erlaubt, verschiedene Arten von Eingaben zu verwenden. Dies scheint flexibler zu sein.

Beachten Sie jedoch, dass ich :other An simple_fields_for Übergeben musste, damit dies funktioniert. Sie können eine beliebige Zeichenfolge/ein beliebiges Symbol übergeben solange es kein Modell mit demselben Namen gibt.

Das heißt Leider kann ich :user nicht übergeben, da simple_form versuchen würde, ein Benutzermodell zu instanziieren, und wir würden die gleiche Fehlermeldung erneut erhalten ...

37
asgeo1

Auch wenn Sie nur versuchen, etwas hinzuzufügen und in das params zu übernehmen, es aber nicht in den Hash des Modells aufnehmen, können Sie einfach FormTagHelpers ausführen. http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

Beispiel:

    <%= 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 -%>
13
Richard Ortega

Ich fand eine sehr einfache (und etwas seltsame) Problemumgehung.

Füge einfach das input_html Option mit einer beliebigen value Taste. Z.B:

= simple_form_for @user do |f|
  = f.input :whatever, input_html: {value: ''}

Getestet von simple_Versionen: 3.2.1, 3.5.1

1
user1201917