2016-11-07 4 views
1

я следующий маршрут:Зачем нужна текущая страница? вернуть ошибку «нет маршрута», когда я делаю это на полностью управляемом ресурсе?

resources :profiles do 
    member do 
     patch :speed_rating 
     patch :dribbling_rating 
     patch :passing_rating 
     patch :tackling_rating 
     post :favorite 
     post :unfavorite 
    end 
    collection do 
     get :autocomplete 
    end 
    end 

, который генерирует следующий маршрут, который я заинтересован в:

# truncated for brevity 
profiles_path GET /profiles(.:format) profiles#index 

profile_path GET /profiles/:id(.:format) profiles#show 

В моей application.html.erb, у меня есть это:

<% if current_page?(controller: "profiles", action: "show")%> 
     <div id="page-wrapper" class="gray-bg"> 
    <% else %> 
     <div id="page-wrapper" class="image-bg"> 
    <% end %> 

Когда я перейдите на мой Profiles#Show, он отлично работает, но когда я перехожу на свой Profiles#Index (иначе мой root_path), я получаю что-то еще:

Started GET "/" for ::1 at 2016-11-07 16:52:01 -0500 
    User Load (1.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 7], ["LIMIT", 1]] 
Processing by ProfilesController#index as HTML 
    Role Load (4.8ms) SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id", 7]] 
    Role Load (12.9ms) SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id", 7]] 
    Role Load (6.7ms) SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'player') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id", 7]] 
    (4.9ms) SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id", 7]] 
    CACHE (0.0ms) SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'player') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id", 7]] 
    (2.6ms) SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL))) [["user_id", 7]] 
    Profile Search (23.5ms) curl http://localhost:9200/profiles_development/_search?pretty -d '{"query":{"match_all":{}},"size":1000,"from":0,"timeout":"11s","_source":false}' 
    Tournament Load (2.7ms) SELECT "tournaments".* FROM "tournaments" ORDER BY "tournaments"."id" ASC LIMIT $1 [["LIMIT", 1]] 
    Rendering profiles/index.html.erb within layouts/application 
    Profile Load (1.7ms) SELECT "profiles".* FROM "profiles" WHERE "profiles"."id" IN (14, 22, 12, 21, 9, 5, 4, 15, 6, 7, 16, 18, 13, 23, 17) 
Read fragment views//profiles/14-20161105042425134917/profiles/22-20161106175803133611/profiles/12-20161101225114614189/profiles/21-20161103035514173735/profiles/9-20161104221706306433/profiles/5-20161105043153971213/profiles/4-20161103035528589634/profiles/15-20161029013919242687/profiles/6-20161105043216951643/profiles/7-20161101001052922220/profiles/16-20161029020526832889/profiles/18-20161101223838805685/profiles/13-20161104221749051281/profiles/23-20161104062851335443/profiles/17-20161105043606243802/af785066fd895798884eea54748241db (0.1ms) 
    Rendered profiles/index.html.erb within layouts/application (12.5ms) 
Completed 500 Internal Server Error in 379ms (ActiveRecord: 36.4ms) 


ActionController::UrlGenerationError - No route matches {:action=>"show", :controller=>"profiles"}: 

Edit 1

Для записи, следующие работы без каких-либо проблем:

<% if (controller_name.eql? "profiles") && (action_name.eql? "show") %> 
+0

: controller => "profile" Не должно быть "профилей"? –

+0

@ EricDuminil это. Виноват. Я тестировал, было ли это важно, если бы я использовал 'current_page? (Controller:« profile »)', и я вставил неправильный вывод журнала. Исправлено. Кроме того, для записи это не имело значения. Ничего не сработало. – marcamillion

ответ

0

Если вы посмотрите на current_page?source code вы поймете, что он использует url_for, который действительно нужны действительные параметры для создания URL-адреса и соответствия с тем, который вы видите в адресной строке.

url_for(controller: "profiles", action: "show") не сможет найти этот маршрут без :id. Если вы попытаетесь использовать current_page?(controller: "profiles", action: "show", id: 1), вы увидите, что ошибка не будет повышена.

current_page не лучший вариант для этой работы, потому что он предназначен для проверки идеального соответствия, в том числе других параметров строки запроса, например:

# http://www.example.com/shop/checkout?order=desc&page=1 
current_page?(controller: 'shop', action: 'checkout', order: 'desc', page: '1') 

В вашем конкретном случае, вы хотите его, чтобы соответствовать любая страница, отображающая действие шоу. Я думаю, что решение, которое вы представили в своем Редактировать 1 подходит. Вы всегда можете обернуть его в свой собственный помощник, если хотите его очистить.