我正在研究Ryan Bates的Railscast#124:Beta邀请。我已经准备好了所有代码,但我还有两个问题。
我认为这两个问题并不相关,但考虑到它们的可能性,我认为我应该同时提及这两个问题。有没有人知道为什么我遇到这两个问题?
以登录用户身份发送电子邮件邀请时出现错误消息:
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)))'
答案 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。