Ruby on rails 获取NoMethodError(未定义的方法`合并';for&<;RailsConfig::Options address=&“;smtp.sendgrid.net”;,端口=587

Ruby on rails 获取NoMethodError(未定义的方法`合并';for&<;RailsConfig::Options address=&“;smtp.sendgrid.net”;,端口=587,ruby-on-rails,devise,sendgrid,Ruby On Rails,Devise,Sendgrid,我使用的是rails 4.1.6和Desive版本3.4.1,每当用户注册时,电子邮件都会发送给用户。对于电子邮件,我使用了Sendgrid,电子邮件发送延迟作业,但我发现以下错误 INFO -- : Parameters: {"utf8"=>"✓", "authenticity_token"=>"4CwXT+J4dG1H9LqAlLpwnet4kGjLKXUVAXZl3n2FVv4=", "user"=>{"profile_attributes"=>{"first

我使用的是rails 4.1.6和Desive版本3.4.1,每当用户注册时,电子邮件都会发送给用户。对于电子邮件,我使用了Sendgrid,电子邮件发送延迟作业,但我发现以下错误

INFO -- :   Parameters: {"utf8"=>"✓",  "authenticity_token"=>"4CwXT+J4dG1H9LqAlLpwnet4kGjLKXUVAXZl3n2FVv4=", "user"=>{"profile_attributes"=>{"first_name"=>"dd",  "last_name"=>"dd"}, "email"=>"test_email@yopmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}}
[2015-05-21T11:22:12.638783 #22298]  INFO -- : Completed 500 Internal Server Error in 92ms
[2015-05-21T11:22:12.641223 #22298] FATAL -- : 

NoMethodError (undefined method `merge' for #<RailsConfig::Options address="smtp.sendgrid.net", port=587, domain="abc.com", user_name="abc", password="sdhs", authentication="plain", enable_starttls_auto=true>):
app/controllers/users/registrations_controller.rb:11:in `create'

我遇到上述错误,非常感谢您的帮助。

问题是RailsConfig gem,您正在尝试将哈希分配给smtp设置

development.rb
production.rb

config.action_mailer.smtp_settings = Settings.smtp_settings
但是
Settings.smtp\u Settings
的类是

Settings.smtp_settings.class
#=> RailsConfig::Options < OpenStruct
因此,您需要将值更改为散列

Settings.email_provider.to_hash.class
#=> Hash < Object

Settings.email_provider.to_hash
#=> {
#=>                :address => "smtp.sendgrid.net",
#=>                   :port => 587,
#=>                 :domain => "test.domain.com",
#=>              :user_name => "username",
#=>               :password => "password",
#=>         :authentication => "plain",
#=>   :enable_starttls_auto => true
#=> }
Settings.email_provider.merge({some_key: 2})
#=> NoMethodError: undefined method `merge' for #<Config::Options
#=>   address="smtp.sendgrid.net", port=587, domain="test.domain.com",
#=>   user_name="username", password="password", authentication="plain",
#=>   enable_starttls_auto=true>
Settings.email_provider.to_hash.class
#=> Hash < Object

Settings.email_provider.to_hash
#=> {
#=>                :address => "smtp.sendgrid.net",
#=>                   :port => 587,
#=>                 :domain => "test.domain.com",
#=>              :user_name => "username",
#=>               :password => "password",
#=>         :authentication => "plain",
#=>   :enable_starttls_auto => true
#=> }
config.action_mailer.smtp_settings = Settings.smtp_settings

# to

config.action_mailer.smtp_settings = {
  address: Settings.smtp_settings.address,
  port: Settings.smtp_settings.port,
  domain: Settings.smtp_settings.domain,
  user_name: Settings.smtp_settings.user_name,
  password: Settings.smtp_settings.password,
  authentication: Settings.smtp_settings.authentication,
  enable_starttls_auto: Settings.smtp_settings.enable_starttls_auto
}