Rails简单表单字段与模型无关。

17 浏览
0 Comments

Rails简单表单字段与模型无关。

我有一个已经与一个名为“Order”的模型相关联的现有表单,但我想添加新的表单字段,以捕获信用卡信息,例如姓名,信用卡号码等,以便在第三方付款网关上处理。

但是,由于我不想在数据库中保存信用卡信息,因此我的订单表中没有相应的列。当提交表单时,这会导致错误,即信用卡输入字段不是“订单模型”的一部分。

admin 更改状态以发布 2023年5月21日
0
0 Comments

你可以使用 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

0
0 Comments

如果我理解你的答案正确的话,你想做的事在这里的官方维基页面中有解释:创建一个不读取属性的虚构输入。你可以按照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

0