74

「注文」という名前のモデルに関連付けられている既存のフォームがありますが、サードパーティの支払いゲートウェイで処理される名前、CC番号などのクレジットカード情報をキャプチャする新しいフォームフィールドを追加したいと思います。

しかし、CC情報をデータベースに保存したくないので、注文テーブルにそれに対応する列がありません。また、フォームを送信すると、これらのクレジットカードの入力フィールドが注文モデルの「一部」ではないというエラーが発生します。

4

5 に答える 5

48

私があなたの答えを正しく理解していれば、あなたがやりたいことは公式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
于 2013-02-02T06:21:00.163 に答える
44

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 の違い

于 2012-08-27T17:27:52.967 に答える