2016-09-09 16 views
3

のメソッドにパラメータを渡すコントローラからclass <<selfのメソッドにデータを渡す際に問題が発生しました。何らかの理由でエラーが発生しました。wrong number of arguments (0 for 1)が表示されています。エラー、または私がどのようにそれを解決することができます。Ruby on Rails:<< self

マイアプリ/コントローラ/ emails_controllerコードは次のとおりです。

def create 
    # Make a new email 
    @email = Email.new(email_params) 
    # For the email, store the user id as the id of the user logged in 
    @email.user_id = session[:user_id] 
    # store the user id 
    @user = session[:user_id] 
    # if the email has saved in the database 
    if @email.save 
     email_to_name = @email.to_name 
     # split the email addresses selected by the ";" 
     @emails = (email_params[:to]).split("; ") 
     # for each email address selected do the following 
     @emails.each do |emailaddress| 
      # the "to" section of the email is to one email address 
      @email.to = emailaddress 
      # find who to address the email to using the Contact model 
      @email.to_name = address_email_to(email_to_name, @email.prefix, emailaddress) 
      # find the contact the user wants to email 
      contact = Contact.find_by_email(emailaddress).id 
      # generate a unsubscribe token 
      @unsubscribe = Rails.application.message_verifier(:unsubscribe).generate(contact)  
      # PASS THE ACCOUNT ID TO THE SMTP SETTINGS METHOD IN MY MAILER 
      UserEmails.smtp_settings(@email.account_id) 
      # send the email 
      UserEmails.send_email(@email, @unsubscribe, @email.logo).deliver_now 
     end 
     # show the email 
     redirect_to @email, notice: 'Email was successfully created.' 
    # if not saved 
    else 
     # go back to the new email page 
     redirect 'new' 
    end 
    end 

private 
def email_params 
    res = params.require(:email).permit(:account_id, :cc, :bcc, :subject, :greeting, :to_name, :prefix, :message, :from_name, :logo, to: []) 
    res[:to] = res[:to].join('; ') 
    res 
end 

そして、私のアプリ/メーラー/ user_emails.rbは次のとおりです。

class UserEmails < ApplicationMailer 

    if Rails.env.development? 
     class <<self 
      def smtp_settings(account) 
      options = YAML.load_file("#{Rails.root}/config/mailers.yml")[Rails.env]['send_email'] 
      @@smtp_settings = { 
       :address    => 'smtp.gmail.com', 
       :port     => 587, 
       :domain    => 'my-domain.com', 
       :authentication  => 'plain', 
       # FIND THE USER-NAME IN THE ACCOUNT MODEL 
       :user_name   => Account.find_by_id(account).email, 
       :password    => 'my password', 
      } 
      end 
     end 
    end 
    def send_email(email, unsubscribe, logo) 
     @url = 'http://localhost:3000/users/login' 
     @email = email 
     @unsubscribe = unsubscribe 
     @logo = logo 
     mail(from: "#{@email.from_name} <#{@email.account.email}>", to: @email.to, cc: @email.cc, bcc: @email.bcc, subject: @email.subject, message: @email.message) 
    end 
end 

ログが読み:

Started POST "/emails" for ::1 at 2016-09-09 11:11:15 +0100 
Processing by EmailsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"rCvqJpUNAMker3u6R5sOLjP317oN33t7LSAbJoul1nNkfRt/WwJYT+4vS/fmNW37/XzSOREqafIj/Dqf1k330Q==", "email"=>{"from_name"=>"Ben Smith", "account_id"=>"30", "to"=>["[email protected]", ""], "logo"=>"", "subject"=>"", "greeting"=>"No Greeting", "to_name"=>"No Name", "prefix"=>"No", "message"=>""}, "commit"=>"Create Email"} 
    [1m[35m (0.0ms)[0m begin transaction 
    [1m[36mSQL (1.0ms)[0m [1mINSERT INTO "emails" ("account_id", "subject", "greeting", "to_name", "prefix", "message", "from_name", "logo", "to", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)[0m [["account_id", 30], ["subject", ""], ["greeting", ""], ["to_name", "No Name"], ["prefix", "No"], ["message", ""], ["from_name", "Ben Smith"], ["logo", ""], ["to", "[email protected]; "], ["user_id", 2], ["created_at", "2016-09-09 10:11:15.382459"], ["updated_at", "2016-09-09 10:11:15.382459"]] 
    [1m[35m (205.0ms)[0m commit transaction 
    [1m[36mContact Load (0.0ms)[0m [1mSELECT "contacts".* FROM "contacts" WHERE "contacts"."email" = ? LIMIT 1[0m [["email", "[email protected]"]] 
    [1m[35mAccount Load (0.0ms)[0m SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = ? LIMIT 1 [["id", 30]] 

UserEmails#send_email: processed outbound mail in 6.0ms 
Completed 500 Internal Server Error in 234ms (ActiveRecord: 206.0ms) 

ArgumentError (wrong number of arguments (0 for 1)): 
    app/mailers/user_emails.rb:5:in `smtp_settings' 
    app/mailers/user_emails.rb:34:in `send_email' 
    app/controllers/emails_controller.rb:58:in `block in create' 
    app/controllers/emails_controller.rb:46:in `each' 
    app/controllers/emails_controller.rb:46:in `create' 


    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.6/lib/action_dispatch/middleware/templates/rescues/_source.erb (1.0ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (4.0ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.6/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.0ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.6/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (1470.1ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/web-console-2.3.0/lib/web_console/templates/_markup.html.erb (0.0ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/web-console-2.3.0/lib/web_console/templates/_inner_console_markup.html.erb within layouts/inlined_string (1.0ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/web-console-2.3.0/lib/web_console/templates/_prompt_box_markup.html.erb within layouts/inlined_string (13.0ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/web-console-2.3.0/lib/web_console/templates/style.css.erb within layouts/inlined_string (1.0ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/web-console-2.3.0/lib/web_console/templates/console.js.erb within layouts/javascript (1370.1ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/web-console-2.3.0/lib/web_console/templates/main.js.erb within layouts/javascript (0.0ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/web-console-2.3.0/lib/web_console/templates/error_page.js.erb within layouts/javascript (0.0ms) 
    Rendered C:/RailsInstaller/Ruby2.2.0/lib/ruby/gems/2.2.0/gems/web-console-2.3.0/lib/web_console/templates/index.html.erb (3191.2ms) 

のために背景情報、私がしようとしているのは、ログインしている各ユーザーごとのSMTPサーバー設定を変更することです。ユーザー名の設定を変更することで動作します。これが動作すれば、各ユーザーの他のsmtp設定も構成します。例えば。ユーザー1が電子メールを送信するときに、各ユーザーのアドレス、ポート、ドメイン、認証ユーザー名、およびパスワードが保存されます。私は、この理論がうまくいくかどうかを知るために、ちょっとしたテストとしてuser-nameを含めるだけです。

誰かが私の問題を解決するのに役立つことができますか?

私は @email = Email.new(email_params)

を間違っているが、あなたのコントローラのコードであれば、私はそのあなたがのparamsを定義したと仮定して、私はあなたがあなたのemail_paramsを定義していないしていない

+0

stacktraceの最初の5〜7行を投稿しますか? – mudasobwa

+0

'send_email'メソッドの' app/mailers/user_emails.rb:34'に、この 'smtp_settings'をパラメータなしで呼び出します。コントローラーは問題とは無関係です。 – mudasobwa

+0

私は 'send_email'メソッドも含めましたが、これがどのように問題になるのか分かりません。 –

答えて

3

smtp_settingsメソッドはActionMailerでパラメータが0のメソッドとしてすでに定義されています。 1つのパラメータを持つメソッドとして定義し直しました。これにより、現在のエラーapp/mailers/user_emails.rb:34:in send_email '.メールmethod is calling smtp_settings`がパラメータなしで発生します。 1つの解決策は、ActionMailerで利用可能な既存のメソッドと競合しないようにメソッドの名前を変更することです。しかし、私はこのアプローチが良くないと思う。

あなたのできることはmailメソッドにdelivery_method_optionsハッシュとしてSMTP設定を渡すことです。ここに例があります

def send_email(email, unsubscribe, logo) 
    @url = 'http://localhost:3000/users/login' 
    @email = email 
    @unsubscribe = unsubscribe 
    @logo = logo 

    account = Account.find_by_id(email.account) 
    # You can change here all SMTP settings 
    delivery_method_options = { 
    :address    => 'smtp.gmail.com', 
    :port     => 587, 
    :domain    => 'my-domain.com', 
    :authentication  => 'plain', 
    :user_name   => account.email, 
    :password    => 'my password', 
    } 

    mail(
    from: "#{@email.from_name} <#{@email.account.email}>", 
    to: @email.to, 
    cc: @email.cc, 
    bcc: @email.bcc, 
    subject: @email.subject, 
    message: @email.message, 
    delivery_method_options: delivery_method_options 
) 
end 
+0

参考までに、あなたがしようとしていることは、ここに文書化されていると思います:http://guides.rubyonrails.org/v4.0/action_mailer_basics.html#sending-emails-with-dynamic-delivery-options –

+0

それは私の問題!手伝ってくれてどうもありがとう! –

-2

+0

email_paramsの妥当性はここにはありませんが、それでも私は質問に含めました。 –