我的用户模型安装了正常的Devise。注册和退出工作正常,但签到表单只是重定向回到登录页面。
我几乎都保持默认:
session / 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 "/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"=>"MYEMAIL@gmail.com", "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"=>"MYEMAIL@gmail.com", "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 "/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"=>"demeuseja@gmail.com", "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
答案 0 :(得分: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 :(得分:1)
也许是我,但我看不出你在第一个例子中的form_for中有什么变化,但第二个请求路径不正确。
对于您的第一个示例,它正确地使用Devise :: SessionController创建操作来对用户进行签名,但它正在返回未经授权的401。您提供的控制器是UserController,它处理创建新用户的创建和更新操作。这与此无关。
尝试取出网址上的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
引用您的用户模型定义。另一个想法是完全剥离资源,而只是使用你的实际模型名称。
答案 2 :(得分:0)
我没有使用过最新版本的设计,但我猜错了:
path_names: {sign_in: "login", sign_out: "logout"}
表示您应该使用login_path
而不是user_session_path
再次猜测你可能已经尝试了......但是,在你的用户控制器中,你是否有“在过滤器验证之前跳过”或类似的?
如果是这样的话 - 登录操作通常需要跳过前过滤器,否则它将无法进入操作本身,因为当您还在尝试登录时“尚未登录” 。