0

私はDeviseを使用しており、ショービューには次のものがあります:

<%= link_to "Profile", current_user %>

ビューにアクセスすると、次のエラーが表示されます。

No route matches {:controller=>"users", :action=>"show"} missing required keys: [:id]

私の show メソッド (非常に役立つ SO メンバーによって提案されました):

  def show
    if params[:id]
      if current_user
        @user = current_user
      else
        flash[:notice] = "This page is not available"
        redirect_to root_path
      end
    else
      @user = current_user
    end
  end

私のルート:

  devise_for :users, :path => '', :path_names => { :sign_in => 'login', :sign_out => 'logout',
                                      :password => 'password', :confirmation => 'verification',
                                      :unlock => 'unblock', :registration => 'signup',
                                      :sign_up => 'new' }

    get   'login' => 'users/login'

  devise_scope :user do
    get   'login',          to: 'devise/sessions#new'
    get   'users/login',    to: 'devise/sessions#new'
    get   'logout',         to: 'devise/sessions#destroy'
    get   'signup',         to: 'devise/registrations#new'
    get   'password',       to: 'devise/passwords#new'
    match 'users/secret',   to: "devise/passwords#create",      via: :post
    match 'sessions/user',  to: 'devise/sessions#create',       via: :post
    match 'users/signup',   to: 'devise/registrations#create',  via: :post
    match 'users/signup',   to: 'devise/registrations#create',  via: :post
  end

  #resources :users
  #resources :users
resources :sessions

# Authenticated Users:
authenticated :user do
  root to: "users#show", as: :authenticated_root
end 

# Non-Authenticated Users
root to: 'site#index'

get '', to: 'users#show', as: 'user'
get 'edit', to: 'users#edit', as: 'user/edit'

current_user ヘルパーがエラーを返す理由はありますか?

4

1 に答える 1

2

current_user が nil であり、user_path(nil) に対応するルートがないため、認証されていないビジターとしてビューにアクセスすると、このエラーが発生します。最も簡単な修正は、必ずしも私が推奨するものではありませんが、config/routes.rb の次の行を変更することです。

get '', to: 'users#show', as: 'user'

get 'profile', to: 'users#show', as: 'profile'

ビューを次のように更新します。

<%= link_to "Profile", (current_user ? user_path(current_user) : profile_path) %>

より複雑な (ただし、私の意見ではアーキテクチャ的に優れたオプション) は、ユーザー コントローラーからすべての no-id ロジックを引き出して、次のようなインデックス メソッドを持つプロファイル コントローラーに入れることです。

class ProfileController
  before_filter :check_authentication, only: [:index]

  def check_authentication
    unless current_user
      flash[:notice] = "This page is not available"
      redirect_to root_path
    end
  end

  def index
    @user = current_user
    render 'users/show'
  end
end

次に、一致するルートを追加し、リンクを更新してこのアクションを指すようにします。

あなたが作成したユーザーの show メソッドは、基本的に params[:id] を無視します。つまり、実際には show メソッドではないということです。渡された ID に関係なく、常に current_user のページが表示されます。この ProfileController はそれを反映しています。

次に、ユーザーの show メソッドは、id で検索するだけの必要最小限の show メソッドになります。

于 2013-11-05T17:19:33.557 に答える