我正在尝试将一个显示操作的链接放入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) %>
答案 0 :(得分:7)
ActionView::Template::Error: No route matches {:action=>"index"}
的原因是:
link_to
需要两个参数(文字和网址)(api)。你只通过了一个。将文本作为第一个参数传递后,它将正常工作。
如果你真的想要,根据文件,你传递nil作为第一个参数,然后url作为第二个参数。