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)
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的答案,因为它不允许你使用不同类型的输入.这似乎更灵活.
请注意,虽然这个工作,我不得不传递:other
给simple_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)
我发现了一个非常简单(而且有点奇怪)的解决方法。
只需添加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
归档时间: |
|
查看次数: |
39623 次 |
最近记录: |