2017-06-06 7 views
-2

のPersonを見つけることができませんでした。以前はweb用に何も開発していませんでしたが、今は既存のデータベースのデータを表示する簡単なアプリケーションを作成する必要があります。'login' =

それぞれのユーザーはそれぞれのデータのみを表示する必要があります。そのユーザーと他のテーブルに参加するクエリを実行するには、何らかの認証方法が必要です。私は事をシンプルに保つように努力しました、ユーザーがしなければならないのは、Pessoaテーブルの主キーであるユーザー名です(パスワードなし、電子メール確認なし、何もありません)。

私はRailsGuidesについてのいくつかのチュートリアルを読んでおり、www.rubypigeon.com/posts/how-to-implement-simple-authentication-withde-devise/で認証していますが、私のログインが機能する。

ここに私のコードは、これまでのところです:

にHomeController:

class HomeController < ApplicationController 
    def index 
    end 

    def login 
    @user = Pessoa.new 
    end 

    def sign_in 
    @user = Pessoa.find(params[:id]) 

    if @user 
     session.clear 
     session[:user_id] = @user.id 
     render '/' 
    else 
     @error = 'Username or password was incorrect' 
     erb :sign_in 
    end 
    end 

    def sign_out 
    session.clear 
    render '/' 
    end 

    helper_method :current_user 
    def current_user 
    if session[:user_id] 
     Pessoa.find (session[:user_id]) 
    else 
     nil 
    end 
    end 
end 

ビュー/ホーム/ login.html.erb:

<%= form_for @user, url: home_sign_in_path do |f| %> 

    <div class="field"> 
    <%= f.label :"digite seu login" %> 
    <%= f.text_field :id %> 
    </div> 

    <div class="actions"> 
    <%= f.submit :entrar %> 
    </div> 

<% end %> 

routes.rbを

Rails.application.routes.draw do 
    root 'home#index' 
    get 'home/index' 

    get 'home/login', to: 'home#login' 
    post 'home/sign_in', to: 'home#sign_in' 
    post 'home/sign_out', to: 'home#sign_out' 

    resources :pessoas 
end 

/views/home/index.html.erbには主キーが変更されなければならなかった理由は、静的なHTMLのものの多くは、その上の唯一のRubyコードは、私は、PostgreSQLのレガシーテーブルで働いている

<%= link_to 'Login', home_login_path %> 

Pessoa.rb

class Pessoa < ApplicationRecord 
    self.table_name = 'pessoa' 
    self.primary_key = 'login' 
end 

である、というのです。

localhost:3000/home/loginにアクセスしてログインすると、this というエラーメッセージが表示されます。変わった部分は、私がコンソール上でエラーを出すのと同じ行を実行すれば、うまく動作します。

私が言ったように、私は一般的にRailsとWeb開発の新機能ですから、私は見た目には分かりません。どんな助けもありがとう。

Btw、リソース名は気にしないでください。 "Pessoa"は私の母国語であるポルトガル語の "Person"を意味します。

development.logは:

Started GET "/home/login" for 127.0.0.1 at 2017-06-06 20:22:45 -0300 
Processing by HomeController#login as HTML 
    Rendering home/login.html.erb within layouts/application 
    Rendered home/login.html.erb within layouts/application (12.4ms) 
Completed 200 OK in 1504ms (Views: 1369.5ms | ActiveRecord: 0.0ms) 


Started POST "/home/sign_in" for 127.0.0.1 at 2017-06-06 20:22:50 -0300 
Processing by HomeController#sign_in as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Jzt0Yeven91Kl8DrfjpJa8I9PJjr7SzKmE43lwprjlopV7l+zFU6EUjUgAiKYJhzemm7xu8NGfiPj3E5h5EiYw==", "pessoa"=>{"id"=>"gabrielbrito"}, "commit"=>"entrar"} 
    [1m[36mPessoa Load (1.5ms)[0m [1m[34mSELECT "pessoa".* FROM "pessoa" WHERE "pessoa"."login" = $1 LIMIT $2[0m [["login", nil], ["LIMIT", 1]] 
Completed 404 Not Found in 9ms (ActiveRecord: 1.5ms) 



ActiveRecord::RecordNotFound (Couldn't find Pessoa with 'login'=): 

app/controllers/home_controller.rb:10:in `sign_in' 
Started PUT "/__web_console/repl_sessions/ed3bb60f3a72a0c0b0c951fa03c0f23d" for 127.0.0.1 at 2017-06-06 20:22:56 -0300 
Started PUT "/__web_console/repl_sessions/ed3bb60f3a72a0c0b0c951fa03c0f23d" for 127.0.0.1 at 2017-06-06 20:22:58 -0300 
Started PUT "/__web_console/repl_sessions/ed3bb60f3a72a0c0b0c951fa03c0f23d" for 127.0.0.1 at 2017-06-06 20:23:04 -0300 
[1m[36mPessoa Load (1.2ms)[0m [1m[34mSELECT "pessoa".* FROM "pessoa" WHERE "pessoa"."login" = $1 LIMIT $2[0m [["login", "gabrielbrito"], ["LIMIT", 1]] 

Started GET "/home/login" for 127.0.0.1 at 2017-06-06 21:27:45 -0300 
Processing by HomeController#login as HTML 
    Rendering home/login.html.erb within layouts/application 
    Rendered home/login.html.erb within layouts/application (6.2ms) 
Completed 200 OK in 1626ms (Views: 1152.5ms | ActiveRecord: 7.5ms) 


Started POST "/home/sign_in" for 127.0.0.1 at 2017-06-06 21:27:52 -0300 
Processing by HomeController#sign_in as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"q2ffWM1gqaXfCrsFm7KlGKwR/iTDoQBflquem2BKSaeMyKBiIaUrtnIkoEXNztUWRasIGGg0qZZxpdYao8xb9Q==", "pessoa"=>{"id"=>"gabrielbrito"}, "commit"=>"entrar"} 
    [1m[36mPessoa Load (2.8ms)[0m [1m[34mSELECT "pessoa".* FROM "pessoa" WHERE "pessoa"."login" = $1 LIMIT $2[0m [["login", "gabrielbrito"], ["LIMIT", 1]] 
Completed 500 Internal Server Error in 23ms (ActiveRecord: 2.8ms) 


NoMethodError (undefined method `empty?' for nil:NilClass): 

app/controllers/home_controller.rb:15:in `sign_in' 

EDIT:、@ジェリーの助けのおかげで解決しました。

+1

エラーとあなたのコントローラされていますあなたのコードは '@user = Pessoa.find(params [:id])'を持っていますが、エラーは '@user = Pessoa.find(params [:pessoa] [:id])'となります。現在のコードでもエラーが表示されますか? – Gerry

+0

コンソール/ログに出力を表示できますか? – Gerry

+0

私は悪いですが、以前は '@user = Pessoafind(params [:id])'を試しましたが、コンソールで入力してもそれは無かったので、 '@user = Pessoa.find(params [:pessoa] [ :id]) '、新しいコードは、コンソールが私にテーブルのレコードを表示しても、私に同じエラーを与えます。 EDIT:ログで更新 –

答えて

0

UPDATE

あなたのモデルでself.primary_key = 'login'の問題のようですので、あなたのルートにそのキーを追加してみてください:

resources :pessoas, param: :login 

一貫性を保つために、あなたはまた、任意の参照を変更する必要があります

@user = Pessoa.find_by(login: params[:pessoa][:login]) 

A:お使いのコントローラでは、loginからid、 NDビューで:

<div class="field"> 
    <%= f.label :"digite seu login" %> 
    <%= f.text_field :login %> 
</div> 

は、「未定義のメソッド '空?'

についてnilのために:NilClass」の行にあなたはどちらかredirect_toview_nameあなたがレンダリングするビューの名前であるかrender view_name(別のページにリダイレクトするように)しrender '/'を変更する必要があります 『/』

レンダリングします。あなたが家にリダイレクトしたい場合

たとえば、あなたがこれを行うことができます。また

redirect_to home_path 

、ユーザーが入力したときに同じエラーを避けるためにfind_by代わりfindのを使用する必要があります無効login(DBに存在しない、すなわち1):

@user = Pessoa.find_by(login: params[:pessoa][:login]) 

この方法ので、あなたが空のコレクションの代わりに、エラーが発生します(例: ception)、あなたはまた、あなたがUserが見つかった場合の評価方法を更新する必要があります。

if @user.present? 
    # success code 
else 
    # failure code 
end 

はすべて一緒にそれを置く、あなたのsign_inアクションは次のようになります。

def sign_in 
    @user = Pessoa.find_by(login: params[:pessoa][:login]) 

    if @user.present? 
    session.clear 
    session[:user_id] = @user.id 
    redirect_to home_path 
    else 
    @error = 'Username or password was incorrect' 
    end 
end 
+0

同じエラーです。新しいfind_byを入力すると、同じ出力がコンソールに表示されます。フォームからのパラメータが何とかビューに引き継がれていないように感じます。 –

+0

これはいくつかの進歩です。今、それは "未定義のメソッドは空ですか?" for nil:NilClass "on line' render '/' ' –

+0

@GabrielEugenioああ、それを逃した。私はあなたが正しい、家にリダイレクトされるユーザーをしたいと思いますか?その場合は、 'render'の代わりに' redirect_to'を使う必要があります。それ以外の場合は、 '/'の代わりにレンダリングするビューの名前を使用します。 – Gerry