2011-08-07 4 views
0

私はRuby on Rails 3.0.9を使用しており、私は自分自身で「お問い合わせ」フォームを実装しようとしています。私のルーターファイル内"お問い合わせ"フォームを実装するためのActiveModelの使用上の問題

<%= form_for @contact_us, :url => contact_us_path do |f| %> 
    <%= f.text_field :email %> 
    <%= f.text_field :subject %> 
    <%= f.text_area :message %> 
<% end %> 

...私は:

require 'active_model' 

class ContactUs 
    include ActiveModel::Conversion 
    include ActiveModel::Validations 

    attr_accessor :email, :subject, :message 

    def initialize(attributes = {}) 
    @attributes = attributes 
    end 

    validates :email, 
    :presence => true 

    validates :subject, 
    :presence => true 

    validates :message, 
    :presence => true 


    def persist 
    @persisted = true 
    end 

    def persisted? 
    false 
    end 
end 

...私は私のビューファイル内:私は私のモデルファイル中のSO ...

...持っている:

match 'contact_us' => 'pages#contact_us', :via => [:get, :post] 

...私は私のコントローラファイルに:

class PagesController < ApplicationController 
    def contact_us 
    case request.request_method 

    when 'GET' 
     @contact_us = ContactUs.new 

    when 'POST' 
     @contact_us = ContactUs.new(params[:contact_us]) 
    end 
    end 
end 

上記のコードを使用すると、空白のフィールドを少なくとも含むフォームを送信すると(検証をパスしないようにする)、フォームが再読み込みされますが、これらのフィールドは自動入力されません。つまり、フォームをリロードした後(送信ボタンを押した後に行われます)、フィールド値はすべて空白の値に設定されます。

問題が何ですか? ActiveModelの使用に間違いはありますか?

<%= form_for @contact_us, :url => contact_us_path do |f| %> 
    <%= f.text_field :email, :value => @contact_us.email %> 
    <%= f.text_field :subject, :value => @contact_us.subject %> 
    <%= f.text_area :message, :value => @contact_us.message %> 
<% end %> 

<%= form_for @contact_us, :url => contact_us_path do |f| %> 
    <%= f.text_field :email %> 
    <%= f.text_field :subject %> 
    <%= f.text_area :message %> 
<% end %> 

を交換する

+0

「ActiveRecord」を拡張するのではなく、「active_model」が必要な理由はありますか?私はRailsが初めてで、まだそれを見ていない。 – Nic

+0

@meleeここからです:https://github.com/rails/rails/blob/master/activemodel/examples/validations.rb – Backo

答えて

0

試し編集:私はあなたが大量assigment機能を自分で追加する必要があります

信じて、そのような:

def initialize(attributes = {}) 
    attributes.keys.each do |attr| 
    self.class.send(:attr_accessor, attr.to_sym) 
    instance_variable_set "@" + attr.to_s, attributes[attr.to_sym] 
    end 
end 

self.class.send(:attr_accessor, attr.to_sym)あなたはすでにあなたのようにattr_accessor :email, :subject, :messageを持っていればいいですか?

+0

これは動作しません。フォームを送信すると、 '@contact_us = ContactUs.new(params [:contact_us])'データが入力されないようです。 – Backo

+0

エラーメッセージは常に3つのフィールドすべてで生成されますか? –

+0

はい、それらは降伏しました...そしてあまりにも!これらのエラーが発生するすべてのフィールドを埋める場合にも起こります。 – Backo