「注文」という名前のモデルに関連付けられている既存のフォームがありますが、サードパーティの支払いゲートウェイで処理される名前、CC番号などのクレジットカード情報をキャプチャする新しいフォームフィールドを追加したいと思います。
しかし、CC情報をデータベースに保存したくないので、注文テーブルにそれに対応する列がありません。また、フォームを送信すると、これらのクレジットカードの入力フィールドが注文モデルの「一部」ではないというエラーが発生します。
「注文」という名前のモデルに関連付けられている既存のフォームがありますが、サードパーティの支払いゲートウェイで処理される名前、CC番号などのクレジットカード情報をキャプチャする新しいフォームフィールドを追加したいと思います。
しかし、CC情報をデータベースに保存したくないので、注文テーブルにそれに対応する列がありません。また、フォームを送信すると、これらのクレジットカードの入力フィールドが注文モデルの「一部」ではないというエラーが発生します。
私があなたの答えを正しく理解していれば、あなたがやりたいことは公式wikiページで説明されています: Create a fake input that NOT read attributes . エドワードの提案により、実際のデータベース列に関連しないフィールドを使用できますが、フォーム フィールドがモデルと関係がない場合、モデルで属性を定義する必要はありません。
要約すると、このページで説明されているトリックは、「FakeInput」と呼ばれるカスタム入力を定義し、次のように使用することです。
<%= simple_form_for @user do |f| %>
<%= f.input :agreement, as: :fake %>
....
Fitter Man がコメントしたように、カスタム入力を追加/変更した後は、Rails サーバーを再起動することを忘れないでください。
更新:公式 wiki ページが更新され、古いバージョンの SimpleForm を使用している場合、wiki ページのサンプル コードが機能しないことに注意してください。のようなエラーが発生した場合は、代わりに以下のコードを使用してください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
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についてはこちらを参照してください。 また、便利なスタックオーバーフローの質問については、Ruby の attr_accessor とは何ですか?
attr_accessible と混同しないでください! attr_accessor と attr_accessible の違い