1

私は Rails にかなり慣れていないので、これは明らかなことになるでしょう。しかし、私は 1 日の大半をこの問題について頭を悩ませていました。

私はしばらく取り組んできたRailsアプリを持っていますが、今日メーラーの実装を始めたばかりです。Rails ActionMailer のチュートリアル ( http://guides.rubyonrails.org/v3.0.3/action_mailer_basics.html ) に従いましたが、メーラーは新しいサンプル アプリで正常に動作します。ただし、既存の Rails アプリ (開発環境で実行中) でこれらの手順を逐語的に繰り返すと、以下のエラーが表示されます。DBにエントリを作成し、プレーンテキストとHTMLの両方の電子メールを正しく送信し、エラーを生成します. ここでやろうとしているのは、新しいアカウントの作成時にウェルカム メールを送信することだけですが、コントローラーからメールを送信しようとすると同じエラーが発生します。

ウェルカムメールを送信した後に表示される特定のエラーは次のとおりです。

    Completed 500 Internal Server Error in 280ms

NoMethodError (undefined method `error' for true:TrueClass):
  app/controllers/musers_controller.rb:52:in `block in create'
  app/controllers/musers_controller.rb:50:in `create' 

既存の User テーブルを台無しにしないために、一時的な scaffold と Muser というメーラーを作成しましたが、これが自分の user テーブルで正しく動作することを確認したら削除する予定です。

コード

ログのエラー:

Started POST "/musers" for 127.0.0.1 at 2013-07-10 20:32:34 -0400
Processing by MusersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"OuoEmsjkAVBHZwqPO5b/O4eKw6iZBaLP6vUT6f9WCOI=", "muser"=>{"name"=>"New User", "email"=>"User@email.com"}, "commit"=>"Create"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
   (0.1ms)  begin transaction
  SQL (0.6ms)  INSERT INTO "musers" ("created_at", "email", "name", "updated_at") VALUES (?, ?, ?, ?)  [["created_at", Thu, 11 Jul 2013 00:32:34 UTC +00:00], ["email", "User@email.com"], ["name", "New User"], ["updated_at", Thu, 11 Jul 2013 00:32:34 UTC +00:00]]
   (1.7ms)  commit transaction
  Rendered muser_mailer/registration_confirmation.html.erb (0.1ms)
  Rendered muser_mailer/registration_confirmation.text.erb (0.0ms)
Completed 500 Internal Server Error in 280ms

NoMethodError (undefined method `error' for true:TrueClass):
  app/controllers/musers_controller.rb:52:in `block in create'
  app/controllers/musers_controller.rb:50:in `create'


  Rendered /usr/local/rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.6ms)
  Rendered /usr/local/rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.5ms)
  Rendered /usr/local/rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (15.3ms)

-- Musers_controller の 50 行目と 52 行目 (このエラーが生成されている場所) は、以下のコントローラー コードの 'respond_to do' と 'MuserMailer....deliver' 行に対応していることに注意してください。

コントローラーのアクション:

# POST /musers
  # POST /musers.json
  def create
    @muser = Muser.new(params[:muser])

respond_to do |format|
  if @muser.save
    MuserMailer.registration_confirmation(@muser).deliver
    format.html { redirect_to @muser, notice: 'Muser was successfully created.' }
    format.json { render json: @muser, status: :created, location: @muser }
  else
    format.html { render action: "new" }
    format.json { render json: @muser.errors, status: :unprocessable_entity }
  end
end
  end

メーラー:

class MuserMailer < ActionMailer::Base
   default from: "EmailAddress@Inter.net"

  def registration_confirmation(muser)
    @muser = muser
    mail(:to => muser.email, :subject => "Registered")
  end
end

実際にDBに追加してメールを正しく送信するため、smtp、メール設定、または変数に問題があるとは思いません。メールアクションを呼び出すコントローラーの行をコメントアウトすると、エラーが消えるので、muser ルートに問題があるとは思いません。true:TrueClass のこの 未定義のメソッド「エラー」は、私を夢中にさせています。最近、Devise を Users テーブルにインストールしたので、それが問題の原因であるかどうかわかりません。

より適切な用語がないため、問題はメール送信後に Rails がどのようにルーティングしたいかにあるように感じます。メーラー アクションの最後に Return を配置するかルートを指定する必要があるかのように、コントローラー アクションに戻るようにサーバーに指示します。つまり、私は迷っています!

アップデート

以下は、私が使用している 2 つのメーラー ビュー ファイルです。

registration_confirmation.html.erb

<h3><%= @muser.name %>! You sweet sweet fool!</h3>
<p>Thank you for registering!</p>

registration_confirmation.text.erb

Thank you for registering!

更新 2

Muser のモデルは次のとおりです。

class Muser < ActiveRecord::Base
  attr_accessible :email, :name

end
4

1 に答える 1