我有一个与名为'Order'的模型绑定的现有表单,但我想添加新的表单字段,以捕获要在第三方支付网关上处理的信用卡信息,如姓名,cc号码等
但是因为我不想在我们的数据库中保存CC信息,所以在我的订单表中没有相应的列。在提交表单时,这会给我一个错误,即那些信用卡输入字段不是订单模型的“部分”。
答案 0 :(得分:47)
如果我理解你的答案,你想做的事情在官方维基页面中解释:Create a fake input that does NOT read attributes。根据Edward的建议,您可以使用与任何真实数据库列无关的字段,但如果表单字段与模型无关,则无需在模型中定义属性。
总之,页面中解释的技巧是定义一个名为'FakeInput'的自定义输入,并像这样使用它:
<%= simple_form_for @user do |f| %>
<%= f.input :agreement, as: :fake %>
....
在添加/修改自定义输入后,不要忘记重启rails服务器,如Fitter Man所评论的那样。
更新:请注意,the official wiki page has updated和维基页面上的示例代码不适用于使用旧版SimpleForm的用户。如果您遇到undefined method merge_wrapper_options for...
之类的错误,请使用下面的代码。我正在使用3.0.1并且此代码运行良好。
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
答案 1 :(得分:39)
您可以使用attr_accessor
class Order < ActiveRecord::Base
attr_accessor :card_number
end
现在您可以Order.first.card_number = '54421542122'
执行此操作,也可以在表单或其他任何需要执行的操作中使用它。
请参阅此处了解ruby docs http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor 这里是一个有用的stackoverflow问题What is attr_accessor in Ruby?
不要让它与attr_accessible混淆! Difference between attr_accessor and attr_accessible
答案 2 :(得分:35)
处理此问题的最佳方法是使用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 %>
在此示例中,我添加了一个名为change_password
的新字段,该字段不是基础user
模型的一部分。
这是一个很好的方法,它允许您使用任何简单的表单输入/包装作为字段。我不关心@baxang的答案,因为它不允许你使用不同类型的输入。这似乎更灵活。
请注意,为此,我必须将:other
传递给simple_fields_for
。只要没有具有相同名称的模型,您就可以传递任何字符串/符号。
即。遗憾的是我无法通过:user
,因为simple_form会尝试实例化一个User模型,我们会再次收到相同的错误消息...
答案 3 :(得分:13)
此外,如果您只是尝试添加某些内容并将其添加到params
中,但将其从模型的哈希中删除,则可以执行FormTagHelpers。 http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html
示例:
<%= 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 -%>
答案 4 :(得分:1)
我发现了一个非常简单(且有些奇怪)的解决方法。
只需在input_html
键中添加任何value
键即可。例如:
= simple_form_for @user do |f|
= f.input :whatever, input_html: {value: ''}
经过测试的simple_from版本:3.2.1、3.5.1