2013-02-14 105 views
1

我用我的用戶模型安裝了正常的Devise安裝。註冊並註銷工作正常,但表單中的登錄只是重定向回登錄頁面。設計登錄未完成

我已經把幾乎所有的默認:

會議/ new.html.erb

<h2>Sign in</h2> 

    <%= form_for(resource, :as => resource_name, :url => user_session_path) do |f| %> 
     <div><%= f.label :email %><br /> 
     <%= f.email_field :email %></div><br/> 

     <div><%= f.label :password %><br /> 
     <%= f.password_field :password %></div><br/> 

     <% if devise_mapping.rememberable? -%> 
     <div><%= f.check_box :remember_me %> <%= f.label :remember_me %></div> 
     <% end -%> 

     <div><%= f.submit "Sign in" %></div> 
    <% end %> 

users_controller.rb

class UsersController < ApplicationController 
    # GET /users 
    # GET /users.json 



    def index 
    @users = User.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @users } 
    end 
    end 

    # GET /users/1 
    # GET /users/1.json 
    def show 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @user } 
    end 
    end 

    # GET /users/new 
    # GET /users/new.json 
    def new 
    @user = User.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @user } 
    end 
    end 

    # GET /users/1/edit 
    def edit 
    @user = User.find(params[:id]) 
    end 

    # POST /users 
    # POST /users.json 
    def create 
    @user = User.new(params[:user]) 


    respond_to do |format| 
     if @user.save 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render json: @user, status: :created, location: @user } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /users/1 
    # PUT /users/1.json 
    def update 
    @user = User.find(params[:id]) 

    if params[:user][:password].blank? 
     params[:user].delete(:password) 
     params[:user].delete(:password_confirmation) 
    end 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /users/1 
    # DELETE /users/1.json 
    def destroy 
    @user = User.find(params[:id]) 
    @user.destroy 

    respond_to do |format| 
     format.html { redirect_to users_url } 
     format.json { head :no_content } 
    end 
    end 
end 

路線

devise_for :users, path_names: {sign_in: "login", sign_out: "logout"} 

resources :users 

這裏是試圖登錄之後創建的日誌

Started POST "https://stackoverflow.com/users/login" for 127.0.0.1 at 2013-02-13 19:18:34 -0600 
Processing by Devise::SessionsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"oPVQIraxxQ3m8I4hbqy0r/BLIUaESkNDLFhvtoRIf2Q=", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"} 
Completed 401 Unauthorized in 1ms 
Processing by Devise::SessionsController#new as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"oPVQIraxxQ3m8I4hbqy0r/BLIUaESkNDLFhvtoRIf2Q=", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"} 
    Rendered devise/_links.erb (0.5ms) 
    Rendered devise/sessions/new.html.erb within layouts/application (5.5ms) 
Completed 200 OK in 108ms (Views: 29.8ms | ActiveRecord: 0.0ms | Solr: 0.0ms) 

我嘗試添加改變form_for以下:

<%= form_for(resource, :as => resource_name, :url => user_session_path(resource_name)) do |f| %> 

但把我送到http://localhost:3000/users/login.user這給了我這在開發日誌中:

Started POST "https://stackoverflow.com/users/login.user" for 127.0.0.1 at 2013-02-13 19:21:36 -0600 
Processing by Devise::SessionsController#create as 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"oPVQIraxxQ3m8I4hbqy0r/BLIUaESkNDLFhvtoRIf2Q=", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"} 
Completed 401 Unauthorized in 1ms 

我確定這是一個錯誤或我忽略的東西,因爲除了登錄之外,所有東西都可以工作,但我一直在修補它幾個小時,不知道問題是什麼。任何正確的方向點將非常感激!

謝謝!

編輯

這裏是我的用戶模型,以及:

class User < ActiveRecord::Base 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :email, :password, :password_confirmation, :remember_me 
    attr_accessible :bio, :employer, :looking, :name, :password, :statement, :user_id, :username 



    validates :name, :presence => true, :length => { :minimum => 3 } 

    has_many :venues 

    scope :employer, where(employer:true) 
    scope :looking, where(looking:true) 
    scope :recent, order("created_at_desc").limit(3) 


end 

回答

2

所以爲了暫時解決這個問題,我改變了形式,sessions/new.html.erb從默認:

<h2>Sign in</h2> 

<%= form_for(resource, :as => resource_name, :url => user_session_path) do |f| %> 
    <div><%= f.label :email %><br /> 
    <%= f.email_field :email %></div><br/> 

    <div><%= f.label :password %><br /> 
    <%= f.password_field :password %></div><br/> 

    <% if devise_mapping.rememberable? -%> 
    <div><%= f.check_box :remember_me %> <%= f.label :remember_me %></div> 
    <% end -%> 

    <div><%= f.submit "Sign in" %></div> 
<% end %> 

以下幾點:

<%= form_tag new_user_session_path do %> 
    <%= text_field_tag 'user[email]' %> 
    <%= password_field_tag 'user[password]' %> 
    <%= submit_tag 'Login' %> 
<% end %> 

現在的優良工程的標誌,以及作爲註冊和註銷。我相信我必須回去修復真正的問題,但至少現在是爲了測試目的而工作。如果有人發佈了一個實際的修補程序,而不是像這樣的解決方法,我會接受他們的回答。

感謝您的其他答案!

+1

我在原來的答案中添加了一個編輯。你的文章給了我一個主意。 – 2013-02-15 01:30:12

0

我沒有使用最近的色器件版本,但在胡亂猜測我想說的是:

path_names: {sign_in: "login", sign_out: "logout"} 

表示您應該使用login_path而不是user_session_path


再一次瘋狂的猜測,你可能已經嘗試過......但是,在你的用戶控制器中,你有一個「跳過之前過濾器驗證」或類似?

如果是這樣 - 登錄操作通常需要跳過過濾前的操作,否則它將無法訪問操作本身,因爲在您仍嘗試簽名的情況下「尚未登錄」 in。

+0

謝謝,我試過以及'sign_in_path',它給了我一個'NoMethodError ...未定義的方法''login_path''。 – Jason 2013-02-14 01:43:41

+0

增加了另一種可能性...再次瘋狂猜測。 – 2013-02-14 23:58:50

1

也許是我,但我看不到你在第一個例子中form_for已經改變了什麼,但第二個請求路徑是不正確的。

對於第一個示例,它正確使用Devise :: SessionController創建操作對用戶進行簽名,但它正在返回401未經授權的用戶。您提供的控制器是UserController,它處理用於創建新用戶的創建和更新操作。這裏沒有關係。

嘗試在URL上取出resource_name所以它看起來像:

<%= form_for :resource, as: :resource_name, url: user_session_path do |f| %> 

它返回一個401未經授權錯誤,所以你可能想嘗試重置用戶密碼,看看是否能先解決它。

編輯: 根據您在下面提供的答案,它給了我另一個想法。這些設計示例可能有點過時,特別是如果您使用登錄表單做了些什麼(儘管它看起來不像)。你可以把它們扔到你的application_helper這將確保資源定義的設置。你可以看一下here文件:

def resource_name 
    :user 
end 

def resource 
    @resource ||= User.new 
end 

def devise_mapping 
    @devise_mapping ||= Devise.mappings[:user] 
end 

哪裏User.new引用您的用戶模型定義。另一個想法是完全刪除資源的東西,而只是使用您的實際模型名稱。

+0

對不起,這是一個錯字。我編輯了我的問題,但'<%= form_for:resource,如::resource_name,url:user_session_path do | f | %>'是我如何擁有它的,它添加了給我login.user URL的(resource_name)。感謝您查看它。 – Jason 2013-02-14 01:47:14

+0

你是什麼意思加入它?你有沒有嘗試重置密碼?你可以發佈你的用戶模型嗎?你需要添加'devise:database_authenticatable,::可註冊的,:可確認的,:可恢復的,:stretch => 20' – 2013-02-14 01:50:06

+0

哇我的意思是說「*我*正在添加......」這不是密碼,我試過使新用戶和他們每個人登錄。他們都註冊了,沒問題,但不能重新登錄。我用我的用戶模型編輯了我的帖子。 – Jason 2013-02-14 01:54:43