形成与模型无关的字段
我有一个与名为'订单'的模型绑定的现有表单,但是我想添加新的表单域来捕获信用卡信息,如姓名,cc号码等,以便在第三方支付网关上处理。
但由于我不想在我们的数据库中保存CC信息,因此在我的订单表中没有相应的列。 当提交表单时,这些信用卡输入字段不是订单模型的“部分”,这给了我一个错误。
你可以使用attr_accessor
class Order < ActiveRecord::Base
attr_accessor :card_number
end
现在你可以做Order.first.card_number = '54421542122'
或者将它用于你的表单或你需要做的任何其他事情。
看到这里的红宝石文档http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor和这里有用的stackoverflow问题什么是attr_accessor在Ruby中?
不要混淆attr_accessible! attr_accessor和attr_accessible之间的区别
如果我正确理解你的答案,你想要做的是在这里的官方wiki页面中解释:创建一个不读取属性的假输入。 根据Edward的建议,您可以使用与任何实际数据库列无关的字段,但是如果表单字段与模型无关,则不需要在模型中定义属性。
总之,页面中解释的技巧是定义一个名为'FakeInput'的自定义输入并使用它:
<%= simple_form_for @user do |f| %>
<%= f.input :agreement, as: :fake %>
....
在Fitter Man评论中添加/修改自定义输入后,请不要忘记重新启动您的Rails服务器。
更新:请注意官方维基页面已更新,维基页面上的示例代码对那些使用旧版本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
处理这个问题的最好方法是使用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会尝试实例化用户模型,我们会再次得到相同的错误消息...
上一篇: form fields not related to the model
下一篇: accessor in Rails