rails champs de formulaires simples non liés au modèle
j'ai un formulaire existant qui est lié à un modèle appelé "Order", mais je veux ajouter de nouveaux champs de formulaire qui captureront les informations de carte de crédit tels que le nom, le numéro de cc, etc pour être traités sur une passerelle de paiement de tierce partie.
mais comme je ne veux pas enregistrer les informations du CC dans notre base de données, il n'y a pas de colonnes correspondantes dans ma table de commande. Et cela me donne une erreur en soumettant le formulaire que ces champs d'entrée de carte de crédit ne sont pas "partie" du modèle de commande.
5 réponses
vous pouvez utiliser attr_accessor ""
class Order < ActiveRecord::Base
attr_accessor :card_number
end
Maintenant vous pouvez faire Order.first.card_number = '54421542122'
ou l'utiliser dans votre forme ou quoi que ce soit d'autre que vous devez faire.
voir ici pour ruby docs http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor et ici pour une question utile de flux stackoverflow qu'est-ce que attr_accessor dans Ruby?
ne le confondez pas avec "attrac_accessible"! différence entre attr_accessor et attr_accessible
si je comprends bien votre réponse, ce que vous voulez faire est expliqué dans la page officielle du wiki ici: créez un faux input qui ne lit pas les attributs . Vous pouvez utiliser un champ non relié à une colonne de base de données par la suggestion D'Edward, mais vous n'avez pas besoin de définir un attribut dans votre model si le champ form n'a rien à voir avec le model.
en résumé, le truc expliqué dans la page est de définir une entrée personnalisée appelée 'FakeInput' et l'utiliser comme ceci:
<%= simple_form_for @user do |f| %>
<%= f.input :agreement, as: :fake %>
....
n'oubliez pas de redémarrer votre serveur rail après avoir ajouté/modifié une entrée personnalisée comme L'a commenté Fitter Man.
mise à JOUR: s'il vous Plaît noter que le wiki officiel page est mise à jour et l'exemple de code sur la page du wiki ne fonctionne pas pour ceux qui utilisent les anciennes versions de SimpleForm. Utilisez le code ci-dessous à la place si vous rencontrez une erreur comme undefined method merge_wrapper_options for...
. Je suis utiliser 3.0.1 et ce code fonctionne bien.
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
La meilleure façon de gérer cela est d'utiliser simple_fields_for
comme suit:
<%= 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 %>
Dans cet exemple, j'ai ajouté un nouveau champ appelé change_password
qui ne fait pas partie du sous-jacent user
modèle.
la raison pour laquelle il s'agit d'une bonne approche, c'est qu'elle vous permet d'utiliser n'importe laquelle des entrées / wrappers de formulaire simples comme champs. Je ne me soucie pas de la réponse de @baxang, parce qu'il ne vous permet pas d'utiliser différents types d'entrées. Ce qui semble le plus flexible.
Avis mais pour que cela fonctionne, j'ai dû passer :other
à simple_fields_for
. Vous pouvez passer n'importe quelle chaîne de caractères/symbole tant qu'il n'y a pas un modèle avec le même nom .
i. e. malheureusement je ne peux pas passer :user
, comme simple_form essaierait d'instancier un modèle Utilisateur, et nous obtiendrions le même message d'erreur à nouveau...
aussi si vous êtes juste en train d'essayer d'ajouter quelque chose et de le mettre dans le params
, mais en le laissant en dehors du hachage du modèle, vous pourriez juste faire des FormTagHelpers. http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html
exemple:
<%= 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 -%>
j'ai trouvé une solution très simple (et assez étrange).
il suffit d'ajouter l'option input_html
avec n'importe quelle touche value
à l'intérieur. Par exemple:
= simple_form_for @user do |f|
= f.input :whatever, input_html: {value: ''}
testé simple_des versions: 3.2.1, 3.5.1