[英]ruby on rails class inside self class passing the get the instant variable
[英]Ruby on Rails: Passing parameters to a method under class <<self
我有一個問題從控制器傳遞數據到class <<self
下的方法,由於某種原因我不斷得到錯誤wrong number of arguments (0 for 1)
並且無法解決為什么我得到這個錯誤或我如何解決它。
我的app / controllers / 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
我的app / mailers / 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@gmail.com", ""], "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@gmail.com; "], ["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@gmail.com"]]
[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發送電子郵件時,這些電子郵件全部按照其設置進行配置,當用戶2發送電子郵件時,這些電子郵件根據其設置進行配置。 我只是在一分鍾內將用戶名作為測試,以確定該理論是否有效。
有人可以幫我解決我的問題嗎?
smtp_settings
方法已在ActionMailer中定義為具有0參數的方法。 您將其重新定義為具有1個參數的方法。 這會導致當前錯誤app/mailers/user_emails.rb:34:in
send_email'中.
mail method is calling
沒有任何參數的情況下method is calling
smtp_settings`。 一種解決方案是將方法重命名為與ActionMailer中現有方法不沖突的方法。 但我認為這種做法並不好。
您可以做的是將SMTP設置作為delivery_method_options
哈希delivery_method_options
給mail
方法。 這是一個例子
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
我不是,如果我錯了,但在你的控制器代碼@email = Email.new(email_params)
你沒有定義你的email_params,因為我認為你定義了params。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.