2

Railsのルーティングに問題があります。ユーザーコントローラーで単一のリソースを使用したいのですが、期待どおりに機能しません。これが私のroutes.rbファイルの断片です:

scope :module => "frontend" do
  root :to => "home#index"
  resource :user, :controller => "user"
  get "/sign_up" => "user#new"
  get "/sign_in" => "user#sign_in"
  get "/sign_out" => "user#sign_out"
  post "/authenticate" => "user#authenticate"
  resources :articles
  resources :article_categories
end

たとえば「/user」や「/user/ new」のURLを使用すると機能すると思いましたが、機能しませんでした。ルーティングエラーが発生します:

No route matches {:controller=>"frontend/user"}

'rakeroutes'コマンドの出力は次のとおりです。

     user POST   /user(.:format)          frontend/user#create
 new_user GET    /user/new(.:format)      frontend/user#new
edit_user GET    /user/edit(.:format)     frontend/user#edit
          GET    /user(.:format)          frontend/user#show
          PUT    /user(.:format)          frontend/user#update
          DELETE /user(.:format)          frontend/user#destroy
  sign_up GET    /sign_up(.:format)       frontend/user#new
  sign_in GET    /sign_in(.:format)       frontend/user#sign_in
 sign_out GET    /sign_out(.:format)      frontend/user#sign_out

POST / authenticate(.: format)フロントエンド/ user#authenticateを認証します

興味深いのは、次のように、ユーザーコントローラーでインデックスアクションのルートを追加すると、次のようになります。

scope :module => "frontend" do
  root :to => "home#index"
  resource :user, :controller => "user"
  get "/user" => "user#index"
  get "/sign_up" => "user#new"
  get "/sign_in" => "user#sign_in"
  get "/sign_out" => "user#sign_out"
  post "/authenticate" => "user#authenticate"
  resources :articles
  resources :article_categories
end

...できます!

しかし、インデックスアクションはユーザーコントローラーで定義されていません!'rakeroutes'コマンドはGET/userに対して二重行を返します

          GET    /user(.:format)          frontend/user#show
          GET    /user(.:format)          frontend/user#index

だから私はそれが解決策ではないと思います。'/users'URLに割り当てられた他のアクションは機能しません。

次のようなインデックスアクションのルートを定義する必要がありますか

get "/controller_name" => "controller_name#index"

私は何が間違っているのですか?

4

2 に答える 2

5

ルートで単一のリソースを定義しても、意図的にインデックス アクションへのルートは生成されません。単一のリソースは、ID を指定せずに常にこのリソースを検索することを意味するため、単一のリソースのインデックスを取得することは論理的に意味がありません。そのため、URL「/user」への GET は、インデックスではなく、その単一のリソースの show アクションにルーティングされます。

編集:あなたの問題は明らかではないので、少なくとも期待するコントローラーをヒットしてそこからビルドできるようになるまで、ルートを単純化します。

config/routes.rb

 scope :module=>"frontend" do
   resource :user
 end
 #ensure you don't have any other user routes listed before this that would match "/user". 

アプリ/コントローラー/フロントエンド/users_controller.rb

 module Frontend
   class UsersController < ApplicationController
     def show
       raise "in frontend/show"
     end
   end
 end
于 2012-08-20T20:31:31.363 に答える
0

助けてくれてどうもありがとう!バグを見つけました。

ルーティング エラーは、レイアウト html ファイルの次の行によって発生しました。

<%= auto_discovery_link_tag(:rss, {:action => "index"}, {:title => "RSS"}) %>

erb ビュー ファイルのエラーを探していましたが、レイアウトを忘れていました。このような状況では、ビュー レイヤー全体を確認することを忘れないでください。

于 2012-08-24T12:02:23.017 に答える