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

时间:2012-04-08 15:41:47

标签: ruby-on-rails rails-activerecord

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

  1. 会话不会在电子邮件发送过程中持续存在。出于某种原因,当签名时 在用户向朋友发送邀请时,应用会注销用户。
  2. 在用户中签名无法发送电子邮件。我收到一条错误消息     关于拥有错误数量的论点。
  3. 我认为这两个问题并不相关,但考虑到它们的可能性,我认为我应该同时提及这两个问题。有没有人知道为什么我遇到这两个问题?

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

        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 < ApplicationController
    
      def new
        @invitation = Invitation.new
      end
    
      def create
        @invitation = Invitation.new(params[:invitation])
        @invitation.sender = current_user
        if @invitation.save
          if current_user?(nil) 
             flash[:notice] = "Thank you, we will notify when we are ready."
             redirect_to root_path       
          else
            UserMailer.invitation.(@invitation, signup_path(@invitation.token)).deliver
            flash[:notice] = "Thank you, invitation sent."
            redirect_to hunts_path 
          end
        else
          render :action => 'new'
        end
      end
    
    end
    

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

    class UserMailer < ActionMailer::Base
      default :from => "********"
    
      def registration_confirmation(user)
        @user = user
        attachments["rails.png"] = File.read("#{Rails.root}/app/assets/images/rails.png")
        mail(:to => "#{user.name} <#{user.email}>", :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 < ActiveRecord::Base
    
      belongs_to :sender, :class_name => '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)))'
    

2 个答案:

答案 0 :(得分:2)

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

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

邀请和(

之间不应该有点

答案 1 :(得分:2)

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

邀请函中的

邀请模型,相关部分

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的内容。请参阅更好的答案here