0

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

考え?

4

1 に答える 1

0

助けてくれてありがとう!2つのエラーが発生したようです。1)ユーザーがユーザーコントローラーに登録したときにユーザーにサインインしなかった、2)サーバーを再起動せず、db:resetを実行した。それを試した後、サインアウトが機能しないことに関係する他の問題が修正されました。

于 2012-10-04T14:29:08.030 に答える