形成与模型无关的字段

我有一个与名为'订单'的模型绑定的现有表单,但是我想添加新的表单域来捕获信用卡信息,如姓名,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会尝试实例化用户模型,我们会再次得到相同的错误消息...

链接地址: http://www.djcxy.com/p/25777.html

上一篇: form fields not related to the model

下一篇: accessor in Rails