【问题标题】:Rails - Mailer Instance Variable Nil in Email ViewRails - 电子邮件视图中的 Mailer 实例变量 Nil
【发布时间】:2012-11-09 14:56:52
【问题描述】:

我正在尝试使用 railscasts 第 124 集的结构创建 beta 邀请,已针对 rails 3.2.8 进行了更新。

目前,邀请电子邮件已发送,但不包含供用户注册的 url(包括邀请令牌),因为我在 ActionMailer (@invitation_link) 中创建的实例变量在视图中为零。在 ActionMailer 控制器中检查 @invitation_link 表明它指向正确的 url,但在视图中它是 nil。

我还检查了以下问题,但没有一个解决方案对我有用:

How do you use an instance variable with mailer in Ruby on Rails?

https://stackoverflow.com/questions/5831038/unable-to-access-instance-variable-in-mailer-view

Actionmailer instance variable problem Ruby on Rails

ActionMailer pass local variables to the erb template

相关代码sn-ps如下:

invitations_controller.rb

class InvitationsController < ApplicationController
  def new
    @invitation = Invitation.new
  end

  def create
    @invitation = Invitation.new(params[:invitation])
    @invitation.sender = current_user
    if @invitation.save
      if signed_in?
        InvitationMailer.invitation(@invitation).deliver
        flash[:notice] = "Thank you, invitation sent."
        redirect_to current_user
      else
        flash[:notice] = "Thank you, we will notify when we are ready."
        redirect_to root_url
      end
    else
      render :action => 'new'
    end
  end
end

invitation_mailer.rb 文件中

class InvitationMailer < ActionMailer::Base
  default from: "holler@thesite.com", content_type: "text/html"

  def invitation(invitation)
    mail to: invitation.recipient_email, subject: "Invitation"
    @invitation_link = invited_url(invitation.token)
    invitation.update_attribute(:sent_at, Time.now)
  end
end

views/invitation_mailer/invitation.text.erb

You are invited to join the site!

<%= @invitation_link %> # INSTANCE VARIABLE THAT IS NIL IN VIEW

routes.rb(仅显示相关行)

match '/invited/:invitation_token', to:  'users#new_invitee', as: 'invited'

【问题讨论】:

    标签: ruby-on-rails actionmailer instance-variables


    【解决方案1】:

    试试这个方法

    这是你的InvitationMailer

    def invitation(invitation)
      @invitation = invitation
      mail(:to => @invitation.recipient_email, :subject => "Invitation")
    end
    

    现在,在你的InvitationsController

    if signed_in?
      @invitation.update_attribute(:sent_at, Time.now)
      InvitationMailer.invitation(@invitation).deliver
      ...
    else
      ...
    end
    

    现在,views/invitation_mailer/invitation.text.erb

    You are invited to join the site!
    <%= invited_url(@invitation.token) %> # INSTANCE VARIABLE THAT IS NIL IN VIEW
    

    【讨论】:

    • 这行得通。如果 @invitation.update_attribute(:sent_at, Time.now) 留在 InvitationMailer 中并在 mail 方法之后调用,也可以使用。看起来他们的关键是在调用邮件方法之前声明实例变量?非常感谢。
    【解决方案2】:

    试试这个...

    @invitation_link = invited_url(invitation.token, :host =&gt; "localhost:3000")

    【讨论】:

    • 视图中仍然为零。如果我在邀请.update_attribute(:sent_at, Time.now) 之前在 ActtionMailer 中运行 raise @invitation_link.inspect,它似乎指向正确的 url。传递给视图时它仍然只是 nil。
    • 在invitation.text.erb文件中试试这个.. "localhost:3000") %>
    猜你喜欢
    • 2017-08-22
    • 2014-04-06
    • 1970-01-01
    • 2013-05-21
    • 2012-06-28
    • 2013-04-14
    • 2012-04-05
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多