Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails简单表单字段与模型无关_Ruby On Rails_Simple Form - Fatal编程技术网

Ruby on rails rails简单表单字段与模型无关

Ruby on rails rails简单表单字段与模型无关,ruby-on-rails,simple-form,Ruby On Rails,Simple Form,我有一个绑定到名为“订单”的模型的现有表单,但我想添加新的表单字段,这些字段将捕获信用卡信息,如姓名、抄送号码等,以便在第三方支付网关上处理 但由于我不想在数据库中保存CC info,所以在我的order表中没有相应的列。这在提交表单时给了我一个错误,即这些信用卡输入字段不是订单模型的“一部分” 您可以使用attr\u访问器 class Order < ActiveRecord::Base attr_accessor :card_number end 类顺序邀请路径(re

我有一个绑定到名为“订单”的模型的现有表单,但我想添加新的表单字段,这些字段将捕获信用卡信息,如姓名、抄送号码等,以便在第三方支付网关上处理


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

您可以使用attr\u访问器

 class Order < ActiveRecord::Base

   attr_accessor :card_number


 end
类顺序
现在,您可以执行
Order.first.card_number='54421542122'
或在表单中使用它,或执行任何需要执行的操作

请参见此处了解ruby文档 这里有一个有用的问题


不要把它和属性混淆了

如果我正确理解了您的答案,您想做的事情将在此处的官方wiki页面中解释:。根据Edward的建议,您可以使用与任何实际数据库列不相关的字段,但是如果表单字段与模型无关,则不需要在模型中定义属性

总之,页面中介绍的技巧是定义一个名为“FakeInput”的自定义输入,并按如下方式使用:

<%= simple_form_for @user do |f| %>
  <%= f.input :agreement, as: :fake %>
  ....

此外,如果您只是尝试添加一些内容并将其放入
参数中,但不将其包含在模型的散列中,则可以只使用FormTagHelpers

例如:

    <%= 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 -%>
resource\u name,:url=>邀请路径(resource\u name),:html=>{:method=>:post}do | f |%>

处理此问题的最佳方法是使用
简单字段\u来处理
,如下所示:

<%= 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\u password
的新字段,它不是底层
user
模型的一部分

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

请注意,为了让它工作,我必须将
:other
传递给
简单字段。只要没有同名的模型,就可以传递任何字符串/符号

也就是说,不幸的是,我无法通过
:user
,因为simple_form会尝试实例化一个用户模型,我们会再次收到相同的错误消息…

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

只需添加
input\uhtml
选项,并在其中添加任何
键即可。例如:

= simple_form_for @user do |f|
  = f.input :whatever, input_html: {value: ''}

测试版本:3.2.1、3.5.1的simple_

我有一个后续问题,在我提交表单后,在控制器上,如何在调用“model.save”时“取消设置”那些CC相关字段,因为它可能会引发错误?您可以使用
参数,除了(:card_number)
在您的控制器中。此问题的可能重复项不是上述链接问题的重复项。这是关于没有连接到模型的整个表单。这是关于选择未连接到表单模型的字段。这会给您带来PCI合规性方面的各种问题,这是非常危险的!!虽然您没有将CC信息保存到数据库中,但如果您将其提交到服务器,所有详细信息都将在您的日志中,如果任何人都可以访问您的日志,则他们可以访问未加密的客户端CC信息。您应该完全避免将此数据提交到服务器。如果确实需要,请查看客户端加密()。否则,请使用直接投递表单或第三方插入工具。祝你好运美好的我从未注意到这一点。您可能必须重新启动/重新加载您的web服务器才能获取此信息。由于某些原因,它不再工作<代码>未定义的方法合并#
@Trein您使用的Rails/SimpleForm版本是什么?@baxang我使用的是v3.0.2。它对rc版本有效吗?很遗憾,我不能在这个项目上使用rc版本(策略…),最简单的答案是最好的。对我有用。
= simple_form_for @user do |f|
  = f.input :whatever, input_html: {value: ''}