Rails邮件程序存在会话持久性和发送电子邮件的问题

我正在研究Ryan Bates的Railscast#124:Beta邀请。 我已经有了所有的代码,但我还有两个问题。

  1. 会话不会通过电子邮件发送过程持续存在。 出于某种原因,当登录用户向朋友发送邀请时,该应用会注销该用户。
  2. 签名用户无法发送电子邮件。 我收到有关错误数量的参数的错误消息。

我不认为这两个问题是相关的,但考虑到他们的机会,我想我应该提两个。 有没有人知道为什么我遇到这两个问题?

以登录用户身份发送电子邮件邀请时出现错误消息:

ArgumentError in InvitationsController#create wrong number of arguments (0 for 2) Rails.root: /*********/MyApp Application Trace | Framework Trace | Full Trace app/mailers/user_mailer.rb:10:in `invitation' app/controllers/invitations_controller.rb:16:in `create' 

调节器

 class InvitationsController  'new' end end end 

寄件人/ User_Mailer.rb。 第10行是“def邀请(邀请,signup_path)”。

 class UserMailer  "********" def registration_confirmation(user) @user = user attachments["rails.png"] = File.read("#{Rails.root}/app/assets/images/rails.png") mail(:to => "#{user.name} ", :subject => "Registered") end def invitation(invitation, signup_path) subject 'Invitation' recipients invitation.recipient_email body :invitation => invitation, :signup_url => signup_path invitation.update_attribute(:sent_at, Time.now) end end 

车型/ invitation.rb

 class Invitation  'User' has_one :recipient, :class_name => 'User' validates_presence_of :recipient_email validate :recipient_is_not_registered validate :sender_has_invitations, :if => :sender before_create :generate_token before_create :decrement_sender_count, :if => :sender private def recipient_is_not_registered errors.add :recipient_email, 'is already registered' if User.find_by_email(recipient_email) end def sender_has_invitations unless sender.invitation_limit > 0 errors.add_to_base 'You have reached your limit of invitations to send.' end end def generate_token self.token = Digest::SHA2.hexdigest([Time.now, rand].join) end def decrement_sender_count sender.decrement! :invitation_limit end end 

的routes.rb

 resources :users, :invitations resources :sessions, :only => [:new, :create, :destroy] match '/signup/', :to => 'users#new' match '/signup/:invitation_token', :to => 'users#new' match '/signin', :to => 'sessions#new' match '/signout', :to => 'sessions#destroy' match '/contact', :to => 'pages#contact' match '/about', :to => 'pages#about' match '/help', :to => 'pages#help' root :to => "pages#home" match ':controller(/:action(/:id(.:format)))' 

好吧,这就是导致Session持久性问题:

邀请模型在invitation.rb,相关部分

 belongs_to :sender, :class_name => 'User' [...] before_create :decrement_sender_count, :if => :sender [...] def decrement_sender_count sender.decrement! :invitation_limit end 

在查看日志后,我看到了减量! 某种方法认为更新数据库中的remember_token也很有趣。 然后cookie中的remember_token不再有效。 我想出的第一个丑陋的解决方法是:

 def decrement_sender_count # sender.decrement! :invitation_limit limit = sender.invitation_limit sender.update_attributes(:invitation_limit => (limit.to_i-1)) end 

我会问另一个问题,找出那里有ActiveRecord的内容。 看到更好的答案。

如果您直接从代码中复制了此内容,则会有一个额外的点,这会导致您在此行中出现exception:

 UserMailer.invitation.(@invitation, signup_path(@invitation.token)).deliver 

邀请函之间应该没有点(