Techioz Blog

Rails の with_locale メソッドでは追加の URL パラメータが許可されないのはなぜですか?

概要

Rails 7 プロジェクトにこのメーラーがあります。

# app/mailers/quote_mailer.rb

class QuoteMailer < ApplicationMailer

  def quote_mail(quote)
    @quote = quote
    @user = quote.user
    @client = quote.client
    @account = quote.account
    I18n.with_locale(@quote.locale) do
      mail(
        :from     => @user.email,
        :to       => @client.email,
        :subject  => "New Quote"
      )
    end
  end

end
# app/views/mailer/quote_mail.text.erb

Dear <= @client.name %>

Please click here to download your Quote:

<%= quote_download_url(@quote.token, :namespace => @account.namespace) %>

Best regards

<%= @user.name %>
# config/routes.rb

Rails.application.routes.draw do

  scope ':locale', :locale => /#{I18n.available_locales.join("|")}/ do

    scope ':namespace' do

      resources :quote_downloads, :only => [:show]

    end

  end

end

残念ながら、メール内のリンクは構築できず、エラーがスローされます。

私の名前空間パラメータが Rails を混乱させているようです。

これはどうすれば修正できますか?

解決策

ロケールがデフォルトの URL オプションとして設定されていない限り、I18n.with_locale が URL にロケールを設定することは期待できません。レンダリングされた電子メールのロケールが変更されることだけを期待します。

ただし、次のようにメーラーで手動で渡すこともできます。

Dear <= @client.name %>

Please click here to download your Quote:

<%= quote_download_url(@quote.token, namespace: @account.namespace, locale: @quote.locale) %>

Best regards

<%= @user.name %>