为什么current_page?当我在完全托管资源上执行时,返回“无路由错误”?

时间:2016-11-07 22:00:22

标签: ruby-on-rails ruby-on-rails-5 actioncontroller

我有以下路线:

  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"}:

修改1

对于记录,以下工作没有问题:

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

1 个答案:

答案 0 :(得分:0)

如果您查看current_page? source code,您会发现它使用url_for,这实际上需要有效的选项来构建网址并与您在地址中看到的网址匹配杆

如果没有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')

在您的特定情况下,您希望它匹配呈现show动作的任何页面。我认为您在编辑1 中提供的解决方案是合适的。如果你想要清理它,你总是可以把它包装起来。