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.

64
demandé sur zeratool 2012-08-27 21:17:32

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

36
répondu Edward 2017-05-23 12:02:39

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
46
répondu baxang 2014-10-13 05:35:54

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

28
répondu asgeo1 2015-10-21 04:42:27

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 -%>
12
répondu Richard Ortega 2013-04-17 05:54:32

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

0
répondu user1201917 2018-09-27 18:48:49