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 "/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
4

3 に答える 3

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 %>

これで、サインインとサインアップおよびサインアウトが正常に機能します。戻って実際の問題を修正する必要があると確信していますが、少なくとも今はテスト目的で機能します。誰かがこのような回避策の代わりに実際の修正を投稿した場合、私は代わりに彼らの答えを受け入れます。

他の回答ありがとうございます!

于 2013-02-15T01:00:08.353 に答える
1

多分それは私ですが、最初の例から form_for で何を変更したかわかりませんが、2 番目の要求パスは正しくありません。

最初の例では、Devise::SessionController create アクションを正しく使用してユーザーをサインインさせていますが、401 無許可を返しています。あなたが提供したコントローラーは、新しいユーザーを作成するための作成および更新アクションを処理する UserController です。ここでは関係ありません。

resource_name次のようになるように、URLを取り出してみてください。

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

これは 401 の不正なエラーが返されるため、最初にユーザー パスワードをリセットして解決するかどうかを確認することをお勧めします。

編集: 以下で提供した回答に基づいて、別のアイデアが得られました。デバイスの例は、特にサインイン フォームで少し変わったことをしている場合は、少し古くなっている可能性があります (ただし、そのようには見えません)。application_helperリソース定義が確実に設定されるように、これらをスローすることができます。ここでそれに関するドキュメントを見ることができます:

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

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

User.newUser モデル定義を参照する場所。もう 1 つのアイデアは、リソースを完全に取り除き、代わりに実際のモデル名を使用することです。

于 2013-02-14T01:44:06.073 に答える
0

私はdeviseの最近のバージョンを使用していませんが、大雑把な推測では次のように言います:

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

login_path 代わりに使用する必要があることを意味しますuser_session_path


繰り返しますが、すでに試したことがあるかもしれませんが、ユーザーコントローラーには「フィルター認証前にスキップ」などがありますか?

その場合、通常、サインイン アクションはその前のフィルターをスキップする必要があります。そうしないと、サインインを試行している間に「まだサインインしていない」ため、アクション自体に到達できません。

于 2013-02-14T01:33:53.090 に答える