rails simple_form字段与模型无关

zer*_*ool 72 ruby-on-rails simple-form

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

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

bax*_*ang 47

如果我理解你的答案,那么你想要做的是在官方维基页面中解释:创建一个不读取属性的虚假输入.根据Edward的建议,您可以使用与任何真实数据库列无关的字段,但如果表单字段与模型无关,则无需在模型中定义属性.

总之,页面中解释的技巧是定义一个名为'FakeInput'的自定义输入,并像这样使用它:

<%= simple_form_for @user do |f| %>
  <%= f.input :agreement, as: :fake %>
  ....
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

  • 您可能必须重新启动/重新加载Web服务器才能将其恢复. (2认同)

Edw*_*ard 40

您可以使用attr_accessor

 class Order < ActiveRecord::Base

   attr_accessor :card_number


 end
Run Code Online (Sandbox Code Playgroud)

现在,您可以Order.first.card_number = '54421542122'在表单中或其他任何需要的地方使用它.

请参阅这里的ruby文档http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor ,这里有一个有用的stackoverflow问题什么是Ruby中的attr_accessor?

不要让它与attr_accessible混淆! attr_accessor和attr_accessible之间的区别


asg*_*eo1 38

处理此问题的最佳方法是使用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 %>
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我添加了一个新的字段change_password,它不是底层user模型的一部分.

这是一个很好的方法,它允许您使用任何简单的表单输入/包装作为字段.我不关心@baxang的答案,因为它不允许你使用不同类型的输入.这似乎更灵活.

请注意,虽然这个工作,我不得不传递:othersimple_fields_for.只要没有具有相同名称的模型,您就可以传递任何字符串/符号.

即不幸的是我无法通过:user,因为simple_form会尝试实例化User模型,我们会再次收到相同的错误消息...


Ric*_*ega 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 -%>
Run Code Online (Sandbox Code Playgroud)


use*_*917 7

我发现了一个非常简单(而且有点奇怪)的解决方法。

只需添加input_html带有任何value键的选项即可。例如:

= simple_form_for @user do |f|
  = f.input :whatever, input_html: {value: ''}
Run Code Online (Sandbox Code Playgroud)

测试 simple_from 版本:3.2.1、3.5.1