Rails简单表单字段与模型无关。
Rails简单表单字段与模型无关。
我有一个已经与一个名为“Order”的模型相关联的现有表单,但我想添加新的表单字段,以捕获信用卡信息,例如姓名,信用卡号码等,以便在第三方付款网关上处理。
但是,由于我不想在数据库中保存信用卡信息,因此我的订单表中没有相应的列。当提交表单时,这会导致错误,即信用卡输入字段不是“订单模型”的一部分。
你可以使用 attr_accessor。
class Order < ActiveRecord::Base attr_accessor :card_number end
现在你可以使用 Order.first.card_number = '54421542122'
或者在你的表单中使用它,或者做任何其他你需要做的事情。
查看这里的ruby文档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
如果我理解你的答案正确的话,你想做的事在这里的官方维基页面中有解释:创建一个不读取属性的虚构输入。你可以按照Edward的建议使用一个与任何真实数据库列无关的字段,但是如果表单字段与模型无关,则不需要在模型中定义属性。
总之,在页面中介绍的技巧是定义一个名为“FakeInput”的自定义输入,并像这样使用它:
<%= simple_form_for @user do |f| %> <%= f.input :agreement, as: :fake %> ....
在添加/修改自定义输入后,请不要忘记重新启动rails服务器,如Fitter Man所评论的那样。
更新:请注意,官方维基页面已更新,如果你使用较旧的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