我正在尝试使用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")