rails simple_form字段与模型无关

时间:2012-08-27 17:17:33

标签: ruby-on-rails simple-form

我有一个与名为'Order'的模型绑定的现有表单,但我想添加新的表单字段,以捕获要在第三方支付网关上处理的信用卡信息,如姓名,cc号码等

但是因为我不想在我们的数据库中保存CC信息,所以在我的订单表中没有相应的列。在提交表单时,这会给我一个错误,即那些信用卡输入字段不是订单模型的“部分”。

5 个答案:

答案 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