1

Ryan BatesのRailscast#124:BetaInvitationsを使用しています。すべてのコードを配置しましたが、まだ2つの問題があります。

  1. セッションは、電子メール送信プロセスを通じて持続しません。何らかの理由で、サインインしたユーザーが友達に招待状を送信すると、アプリはユーザーをサインアウトします。
  2. サインインしたユーザーはメールを送信できません。引数の数が間違っているというエラーメッセージが表示されます。

この2つの問題は関連しているとは思いませんが、偶然にも、両方について言及する必要があると思いました。私がこれらの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 < 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

mailers/User_Mailer.rb。10行目は、「definvitation(invitation、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)))'
4

2 に答える 2

2

これをコードから直接コピーした場合、この行に例外の原因となっている余分なドットがあります。

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

招待状と ( の間にドットがあってはなりません。

于 2012-04-08T15:46:05.070 に答える
2

さて、これはセッションの永続性の問題を引き起こしています:

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 がどうなっているのかを知るために、別の質問をします。ここでより良い答えを参照してください。

于 2012-07-06T09:42:24.270 に答える