2013-02-14 7 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 

Я уверен, что это тупик или что-то, что я забываю, поскольку все работает помимо входа, но я часами занимался этим и понятия не имею, в чем проблема. Любая точка в правильном направлении была бы высоко оценена!

Спасибо!

EDIT

Вот моя модель пользователя, а также:

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

Я добавил изменение в свой первоначальный ответ. Ваш пост дал мне идею. –

0

Я не использовал последнюю версию завещанию, но в диком догадка я бы сказал, что:

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

означает, что вы должны использовать login_path вместо user_session_path


Опять дикая догадка, что вы, возможно, уже пробовали ... но в вашем пользовательском контроллере у вас есть «пропустить перед аутентификацией фильтра» или аналогичный?

Если это так - действия входа в систему, как правило, должны пропускать этот фильтр перед запуском, или он не сможет попасть в действие, потому что «вы еще не вошли в систему», пока вы все еще пытаетесь подписать in

+0

Спасибо, я попробовал это, а также 'sign_in_path', и он дал мне метод NoMethodError ... undefined' 'login_path''. – Jason

+0

добавлен другой возможность ... снова дикий угадать. –

1

Возможно, это я, но я не вижу, что вы изменили в form_for из первого примера, но второй путь запроса неверен.

Для вашего первого примера, это правильно, используя Devise :: SessionController, создайте действие, чтобы подписать пользователя, но он возвращает 401 несанкционированного доступа. Контроллер, который вы предоставили, - это UserController, который обрабатывает действия по созданию и обновлению для создания нового пользователя. Здесь это не актуально.

Попробуйте вынимая resource_name на URL, так как это выглядит:

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

Это 401 несанкционированная ошибка возвращается, так что вы можете попробовать сбросить пароль пользователя, чтобы увидеть, если это решает его первый.

EDIT: Основываясь на ответе, который вы указали ниже, он дал мне еще одну идею. Примеры разработки могут быть немного устаревшими, особенно если вы делаете что-то слегка с формой входа (хотя это не похоже на это). Вы можете выбросить их в свой 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, as:: resource_name, url: user_session_path do | f | %> ', как я это сделал, и он добавлял (имя_каталога), которое дало мне URL login.user. Спасибо, что посмотрели на него. – Jason

+0

Что значит добавить это? Вы пытались сбросить пароль? Можете ли вы опубликовать свою модель пользователя? Вам нужно добавить 'devise: database_authenticatable,: registerable,: confirmable,: recoverable,: stretches => 20' –

+0

Wow Я хотел сказать« * I * добавлял ... »Это не пароль, я пробовал создание новых пользователей и вход с каждым из них. Все они подписываются отлично, выходят хорошо, но не могут войти. Я редактировал свой пост с помощью моей модели пользователя. – Jason

Смежные вопросы