ActionMailer link_to显示操作失败,并且缺少必需的键:[:id]"

时间:2014-09-25 20:38:27

标签: ruby-on-rails ruby-on-rails-4 actionmailer

我正在尝试将一个显示操作的链接放入rails action mailer呈现的视图中。

mailer.rb

class Mailer < ActionMailer::Base
  default from: "foo@bar.com"

  def catalog_download_request(email, catalog)
    @catalog = catalog

    mail({
         to: email
    })
  end

end

的routes.rb

Rails.application.routes.draw do

  scope "(:locale)" do
    resources :catalogs, :path => I18n.t("routes.catalogs"), only: [:index, :show]
  end

end

development.rb:

config.action_mailer.default_url_options = { host: "http://localhost:3000" }
config.action_mailer.asset_host = "http://localhost:3000"

config.action_mailer.delivery_method = :smtp

config.action_mailer.smtp_settings = {
  address: "localhost",
  port: 1025
}

config.action_mailer.raise_delivery_errors = false

我正在调用邮件的模型:

class CatalogDownloadRequest < ActiveRecord::Base
  belongs_to :catalog

  after_create :send_mail

  private

  def send_mail
    Mailer.catalog_download_request(email, catalog).deliver
  end

end

这就是我在我看来尝试的内容:

<%= link_to @catalog %>

错误:

  

ActionView :: Template ::错误:没有路由匹配{:action =&gt;“show”,:controller =&gt;“catalogs”,:format =&gt; nil,:id =&gt; nil,:locale = &gt;#}缺少必需的键:[:id]

另一次尝试:

<%= link_to catalog_url(@catalog) %>

错误:

  

ActionView :: Template ::错误:没有路由匹配{:action =&gt;“index”}

我怀疑这种情况正在发生,因为我在路线上的语言环境范围。

如果我在另一个视图中使用<%= link_to catalog_url(@catalog) %>,则可行。

解决方案:

<%= link_to catalog_url(:id => @catalog.id), catalog_url(:id => @catalog.id) %>

1 个答案:

答案 0 :(得分:7)

ActionView::Template::Error: No route matches {:action=>"index"}的原因是:

link_to需要两个参数(文字和网址)(api)。你只通过了一个。将文本作为第一个参数传递后,它将正常工作。

如果你真的想要,根据文件,你传递nil作为第一个参数,然后url作为第二个参数。