2012-02-12 10 views
1

私のRailsのスキルは錆びているので、おそらく初心者の質問です。私は、単純な電子メールの送信フォームを作成しようとしているが、私は入れません:Rails:電子メールを送信し、Mail :: Message:Classのための未定義のメソッド `model_name 'を得る

NoMethodError in Mail#create 
undefined method `model_name' for Mail::Message:Class 

私は、関連するメソッドは次のようになり、私の問題は私のコントローラであることをかなり確信している:

def create 
    @mail = Mail.new(params[:mail]) 
    MailMailer.send_mail(@mail).deliver 
end 

この行はエラー@mail = Mail.new(params[:mail])を引き起こしていると考えます。

class Mail < ActiveRecord::Base 
    include ActiveModel::Validations 
    validates :password, :presence => true 
    attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message 
end 

そして、私のメーラーは、次のようになります:私のメールモデルクラスは次のようになります

class MailMailer < ActionMailer::Base 
    def send_mail(mail) 
    mail(:to => mail.to, :subject => mail.subject) 
    end 
end 

誰もが私が間違ってやって見つけることができますか?

+0

http://www.railsmine.net/2010/03/rails-3-action-mailer-example.html - 良いチュートリアル – Fivell

+0

私はあなたがI18nをやろうとするyouirのメーラテンプレートだと思います..あなたはそのコードを投稿できますか? – Tigraine

+0

@Tigraine Nah、それはあなたが意味していた場合、私はすべてのローカリゼーションを試みていません。 – Anders

答えて

2

あなたの問題はここおそらくです:ARは、すでにすべての検証のものを含んでいるよう

class Mail < ActiveRecord::Base 
    # ---------^^^^^^^^^^^^^^^^^^ 
    include ActiveModel::Validations 
    validates :password, :presence => true 
    attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message 
end 

ActiveRecord::Baseをサブクラス化し、ActiveModel::Validations含めは少し奇妙です。 ARとattr_accessorを混在させることは、奇妙なことが起こっているという別の兆候です。

$ rails g model mail 

そして、それはそれはほとんど常に、人々が望むものだとして、データベース・バックアップのActiveRecordのモデルを作成しようとします:あなたのコメントで

は、あなたがこのモデルを作成することに注意してください。 Mailが既に使用されているので、別の名前を使用したい場合もあります。

class SomeEmail 
    attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message 
end 

は、おそらくここでの検証は必要ありませんが、あなたはそれらを追加することができます:あなただけのデータの単なる一時的なバッグですモデルをしたい場合は

あなたはこれを行うことができます

class SomeEmail 
    include ActiveModel::Validations 
    validates :password, :presence => true 
    attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message 
end 

ですが、valid?を手作業で呼び出さない限り、検証は実行されません。最後に

、ちょうどattr_accessorを追加すると、あなたに便利なコンストラクタを与えるものではありません、上記の変更のすべてを持つので、この:

@mail = SomeMail.new(params[:mail]) 

まだあなたがどこにも保存されますparams[:mail]で何通りやりたいことはありません。したがって、電子メールクラスにinitialize実装を追加し、コントローラにvalid?を呼び出してください。

関連する問題