Michael Hartのレールに関するチュートリアルを終えた後、私は自分の簡単なアプリを試してみます。
私はなんとかユーザーリソースを作成し、現在、誰かがログインしたときを追跡するためにセッションリソースを作成しようとしています。私はいくつかの本当に奇抜な結果を得ています。
1)誰かがログインしているときと、誰かがログアウトしているときの異なるメニューオプションを表示しようとしていました。予想とは逆の動作をすることを除けば、動作します。つまり、私が書くとき
<ul class="nav pull-right">
<% if signed_in? %>
#menu for registered users
<% else %>
#menu for unregistered users
<% end %>
</ul>
ログインすると未登録ユーザーの#menuが表示され、ログアウトすると登録ユーザーの#menuが表示されます。
2)基本的にユーザーのIDページであるユーザーの管理ページへのリンクも作成しようとしています。
リンクコードとしてこれを次のように入れます
<%= link_to "Admin", user_path(current_user) %>
そしてエラーが発生しました
{:action => "show"、:controller => "users"、:id=>nil}に一致するルートはありません
これにより、セッションヘルパーで定義したcurrent_userが保存されていないと思いますが、思ったよりも、理由はわかりません。
これが私が ユーザーモデルのために持っているコードです
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation
has_secure_password
before_save { |user| user.email = email.downcase }
before_save :create_remember_token
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
validates :password, presence: true, length: { minimum: 6 }
validates :password_confirmation, presence: true
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
セッションコントローラー
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_email(params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid Email/Password Combination' #Not quite right;
render 'new'
end
end
終わり
SessionsHelper
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
end
ApplicationController
class ApplicationController < ActionController::Base
protect_from_forgery
include SessionsHelper
end
考え?