【问题标题】:ActionMailer link_to show action fails with "missing required keys: [:id]"ActionMailer link_to 显示操作失败,“缺少必需的键:[:id]”
【发布时间】:2014-11-20 18:19:51
【问题描述】:

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

ma​​iler.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::Error: 没有路由匹配 {:action=>"show", :controller=>"catalogs", :format=>nil, :id=>nil, :locale=>#}所需键:[:id]

再试一次:

<%= link_to catalog_url(@catalog) %>

错误:

ActionView::Template::Error: 没有路由匹配 {:action=>"index"}

我怀疑这是因为我的区域设置范围在路线上。

如果我在另一个视图中使用&lt;%= link_to catalog_url(@catalog) %&gt;,它可以工作。

已解决:

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

【问题讨论】:

  • 对我来说同样的错误。即使在尝试最简单的示例 &lt;%= recording_url(@recording) %&gt;&lt;%= recording_path(@recording) %&gt; 时,它也是非常基本的 Rails 应用程序,没有任何特别之处。
  • 我认为你需要为我做同样的事情:recording_url(:id =&gt; @recording.id)

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


【解决方案1】:

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

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

如果你真的想要,根据文档,你可以将 nil 作为第一个参数,然后将 url 作为第二个参数。

【讨论】:

  • link_to 仅使用一个参数就可以很好地工作,它将带有 url 作为文本的链接呈现。
  • 我很抱歉我的回答有问题,但你的回答对我来说不够清楚,因为在其他视图中代码有效而在电子邮件视图中无效。因此,link_to 与单个参数一起使用,但不是在那种特定情况下。感谢您尝试帮助我,尽管在我看来您的答案不是 100% 正确,但我将其设置为已解决。
  • 让它工作的真正诀窍在于这部分代码:catalog_url(:id =&gt; @catalog.id)
  • 谢谢(现在很高兴:D)。但我必须指出,link_to 从未设计为接受单个参数。 api.rubyonrails.org/classes/ActionView/Helpers/… 如果你想使用 url 作为名字,你可以传递 nil 作为第一个参数。
  • 这个答案与实际错误无关,从上面的 cmets 来看,似乎与实际修复无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多