Rails-电子邮件视图中的Mailer实例变量无



我正在尝试使用Railscasts第124集的结构创建Beta邀请,该结构已更新为Rails 3.2.8。

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

我还检查了以下问题,并且没有任何解决方案对我有用:

您如何使用Ruby中的Mailer在Rails上使用实例变量?

ActionMailer实例变量问题Ruby on Rails

ActionMailer将本地变量传递给ERB模板

相关代码段:

intswitations_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

in insitation_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/邀请_mailer/intitation.text.erb

You are invited to join the site!
<%= @invitation_link %> # INSTANCE VARIABLE THAT IS NIL IN VIEW

rutes.rb(仅显示相关行)

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

尝试这种方式

这是您的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_link = invited_url(invitation.token, :host => "localhost:3000")

最新更新