1

我需要一点帮助。我在尝试着:

  1. 发送带有链接的电子邮件。
  2. 让链接设置 user.email_activation_token = true
  3. 然后重定向到主页。

目前我有一个指向电子邮件的链接,但它给了我这个错误。(顺便说一句,我正在使用 HAML。)

编辑:目前没有视图。

未知动作

The action 'show' could not be found for UsersController

user_mailer/registration_confirmation

Confirm your email address please!

= accept_invitation_users_url({:token=>@user.email_activation_token})

users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end
  def create
    @user = User.new(params[:user])
    if @user.save
      UserMailer.registration_confirmation(@user).deliver
        redirect_to root_url, :notice => "Signed up!"
    else
        render "new"
    end

    def accept_invitation
        @user = User.find_by_email_activation_token!(params[:token])
        @user.email_activation_token = true
        redirect_to root_url, :notice => "Email has been verified."
    end
  end
end

email_activations_controller.rb

class EmailActivationsController < ApplicationController
    def edit
        @user = User.find_by_email_activation_token!(params[:id])
        @user.email_activation_token = true
        save!
        redirect_to root_url, :notice => "Email has been verified."
    end
    def new
        @user = User.find_by_email_activation_token!(params[:id])
    end

    def edit
    end
end

user.rb(用户模型)

    class User < ActiveRecord::Base
      attr_accessible :email, :password, :password_confirmation

      attr_accessor :password
      before_save :encrypt_password
      before_save { |user| user.email = email.downcase }
      before_create { generate_token(:auth_token) }
      # before_create { generate_token(:email_activation_token) }

      VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
      VALID_PASSWORD_REGEX = /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,}$/
      validates_confirmation_of :password
      validates :password, :on => :create, presence: true, format: { with: VALID_PASSWORD_REGEX }
      validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }

  def self.authenticate(email, password)
   user = find_by_email(email)
   if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
    user
   else  
    nil
  end
end

  def send_password_reset
    generate_token(:password_reset_token)
    self.password_reset_sent_at = Time.zone.now
    save!
    UserMailer.password_reset(self).deliver
  end

  def encrypt_password
    if password.present?
        self.password_salt = BCrypt::Engine.generate_salt
        self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end

def generate_token(column)
  begin
    self[column] = SecureRandom.urlsafe_base64
  end while User.exists?(column => self[column])
end

end

路线.rb

LootApp::Application.routes.draw do
  get "password_resets/new"

  get "sessions/new"

  resources :users
  resources :sessions
  resources :password_resets
  resources :email_activations

  resources :users do
    collection do 
      get :accept_invitation
    end 
  end

  # get "users/new"
  get "static_pages/home"
  get "static_pages/help"


  root to: 'static_pages#home'
  match "sign_up",  to: "users#new"
  match '/help',    to: 'static_pages#help'
  match '/log_in',  to: 'sessions#new'
  match '/log_out', to: 'sessions#destroy'
end
4

4 回答 4

2

在 routes.rb 中有两条用户路线

消除 resources :users

第一个resources users覆盖下一个用户资源

所以应用程序不知道有一个collection路由accept_invitation并将其视为一个id用于显示操作的路径,因为为该操作生成的 url 将是

/users/accept_invitation

与 show 的签名相匹配/users/:id

删除第一个resources :users应该可以解决问题

我也没有看到任何使用 email_activations_controller.rb

也许你可以安全地删除它

于 2013-04-29T07:17:30.617 回答
2

尝试改变这样的路线..

    resources :users do
      collection do 
        get :accept_invitation
      end 
    end

    resources :users
    resources :sessions
    resources :password_resets
    resources :email_activations
于 2013-04-29T07:14:45.850 回答
2

您已经调用了资源 :users 两次。

删除第一个电话

于 2013-04-29T07:16:07.013 回答
2

你为什么在 accept_invitation_users_url 中传递激活令牌而不是 id?当您拥有此代码时:

resources :users do
  member do 
    get :accept_invitation
  end 
end

在路由中,我们假设,accept_invitation 是一个 Restful 路由并且会在它的 url 中给出 id。请参阅http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

所以,我认为你应该做这样的事情:

路线.rb

# resources :users ### Remove this as it is reduntant

resources :users do
  member do 
    get :accept_invitation
  end 
end

user_mailer/registration_confirmation

Confirm your email address please!

= accept_invitation_users_url(@user)

users_controller.rb

def accept_invitation
  @user = User.find(params[:id])
  @user.email_activation_token = true
  redirect_to root_url, :notice => "Email has been verified."
end

看完评论后

是的,正如@Frederick Cheung 在评论中所说,传递 id 而不是令牌会破坏发送电子邮件确认的意义,并使人们可以轻松地确认电子邮件地址而无需实际接收电子邮件。

所以,请参考@PriteshJ 的回答。显然,您刚刚添加了一个额外的行resources :usersroutes.rb我对此大惊小怪:)。只需删除线,你会没事的。

于 2013-04-29T07:39:35.233 回答