这是' shared / subnav'的代码。部分。当我点击链接时,它会显示错误No route matches {:action=>"show", :controller=>"location"}
,但会定义路由。我认为下面的代码存在一些问题。
-if current_page? location_path
= link_to 'Edit Location', edit_location_path
-if current_page? user_path
= link_to 'Edit User', edit_user_path
-if current_page? alert_path
= link_to 'Edit Alert', edit_alert_path
这是我的路线
location GET /locations/:id(.:format) locations#show
user GET /users/:id(.:format) users#show
alert GET /alerts/:id(.:format) alerts#show
答案 0 :(得分:2)
根据您的路线,您无法获得位置,用户和提醒的edit
行为路线。您有show
个操作的路由,因此为所有三个实体添加edit
的路由,然后您需要传递要编辑的对象:
-if current_page? location_path
= link_to 'Edit Location', edit_location_path(current_location)
-if current_page? user_path
= link_to 'Edit User', edit_user_path(current_user)
-if current_page? alert_path
= link_to 'Edit Alert', edit_alert_path(current_alert)
current_location
,current_user
,current_alert
是您要修改的对象。
答案 1 :(得分:1)
您的路线助手已定义,但期待参数。例如,edit_user_path
期望传递user
对象,因此它知道您要编辑哪个用户。
对于用户而言,您可以使用edit_user_path current_user
之类的内容,但对于其他对象,您可能需要pass them in to your partial。
答案 2 :(得分:1)
与current_page相比,您的节目路径也需要一些id值。看看下面的代码,这将解决你的问题。
-if current_page? location_path(current_location or some id)
= link_to 'Edit Location', edit_location_path(current_location or some id)
-if current_page? user_path(current_user or some id)
= link_to 'Edit User', edit_user_path(current_user or some id)
-if current_page? alert_path(current_alert or some id)
= link_to 'Edit Alert', edit_alert_path(current_alert or some id)
答案 3 :(得分:1)
<强>路线强>
最重要的是,由于您将路线定义为成员路线,因此您需要确保将相应的 ID 传递给每个路线:
#config/routes.rb
resources :users, only: [:show, :edit]
resources :locations, only: [:show, :edit]
resources :alerts, only: [:show, :edit]
这意味着你必须将:id
值传递给这些路由中的任何一个 - 可以按如下方式进行:
user_path("2")
-
错误强>
错误显然是在这里创建的:
-if current_page? location_path
如上所述,您需要传递有效的&#34; id&#34;到路径,允许它拉出所需的对象。您需要执行以下操作:
-if current_page? location_path("2")
但是,更紧迫的是你个人对这些方法的要求。当然,必须有一种更好的方法来管理这种逻辑的定义方式。我会尝试以下方法:
-
<强>辅助强>
我想我会这样做一个帮手:
#app/helpers/your_helper.rb
Class YourHelper
def edit_current(controller, object)
current = controller.singularize
return link_to "Edit #{current}", eval("edit_#{current}_path(object)")
end
end
这应该允许你打电话:
<%= edit_current(controller_name, @user) %>