ruby-on-rails - simple_form - rails forms select
rails simple_form campos no relacionados con el modelo (4)
Además, si solo intentas agregar algo y ponerlo en params
, pero dejarlo fuera del hash del modelo, podrías hacer FormTagHelpers. http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html
Ejemplo:
<%= 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 -%>
Tengo un formulario existente que está vinculado a un modelo llamado ''Pedido'', pero quiero agregar nuevos campos de formulario que capturen la información de la Tarjeta de crédito, como el nombre, número de cc, etc., para procesarlos en una puerta de enlace de pago de un tercero.
Pero como no quiero guardar información CC en nuestra base de datos, no hay columnas correspondientes en mi tabla de pedidos. Y esto me da un error al enviar el formulario que los campos de entrada de la tarjeta de crédito no son "parte" del modelo de pedido.
La mejor forma de manejar esto es usar simple_fields_for
como simple_fields_for
:
<%= 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 %>
En este ejemplo, he agregado un nuevo campo llamado change_password
que no forma parte del modelo de user
subyacente.
La razón por la cual este es un buen enfoque, es que le permite usar cualquiera de las entradas / envolturas de formularios simples como campos. No me importa la respuesta de @baxang, porque no le permite usar diferentes tipos de entradas. Esto parece más flexible.
Sin embargo, simple_fields_for
en simple_fields_for
que para que esto funcione, tuve que pasar :other
a simple_fields_for
. Puede pasar cualquier cadena / símbolo siempre que no haya un modelo con el mismo nombre .
Desafortunadamente no puedo pasar :user
, ya que simple_form intentará crear una instancia de un modelo de Usuario, y obtendríamos el mismo mensaje de error otra vez ...
Puedes usar attr_accessor
class Order < ActiveRecord::Base
attr_accessor :card_number
end
Ahora puede hacer Order.first.card_number = ''54421542122''
o usarlo en su formulario o en cualquier otra cosa que necesite hacer.
Consulte aquí para ruby docs http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor y aquí para una pregunta útil sobre stackflow ¿Qué es attr_accessor en Ruby?
¡No lo mezcles con attr_accessible! Diferencia entre attr_accessor y attr_accessible
Si entiendo tu respuesta correctamente, lo que quieres hacer se explica en la página oficial de la wiki aquí: Crea una entrada falsa que NO lee atributos . Puede usar un campo no relacionado con ninguna columna de base de datos real por sugerencia de Edward; sin embargo, no necesita definir un atributo en su modelo si el campo de formulario no tiene nada que ver con el modelo.
En resumen, el truco explicado en la página es definir una entrada personalizada llamada ''FakeInput'' y usarla así:
<%= simple_form_for @user do |f| %>
<%= f.input :agreement, as: :fake %>
....
No olvide reiniciar su servidor de rieles después de agregar / modificar una entrada personalizada como comentó Fitter Man.
ACTUALIZACIÓN: tenga en cuenta que la página oficial de la wiki se ha actualizado y que el código de muestra en la página wiki no funciona para aquellos que usan versiones anteriores de SimpleForm. Use el siguiente código si encuentra un error como el undefined method merge_wrapper_options for...
Estoy usando 3.0.1 y este código funciona 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