添加非标准视图和控制器操作的最佳实践?
Best practice for adding a non standard view and controller action?
我的情况 我有一个 "Parent" 模型和控制器。我想知道为用户添加独立页面(例如仪表板)的最佳做法。我的想法是我可以创建一个视图 dashboard.html.erb
并在父控制器内部创建一个方法:
父控制器
def dashboard
end
Routes.rb
get 'parents/dashboard'
我已经做过一次并且效果很好,但它是针对 'child' 模型的。
当我 运行 在父模型中遇到同样的情况时,我得到错误
ActiveRecord::RecordNotFound 在 ParentsController#show
无法使用 'id'=dashboard
找到父项
1.) 我所做的只是添加一个视图,将 仪表板模型 添加到控制器,并放置 get 'parents/dashboard'
进入 routes.rb 并尝试引用 show 方法???为什么?
2.) 这是将 pages/actions 添加到 rails 应用程序的错误方法吗?
如果您想使用 :id
添加额外的路由,则语法不同。
get 'parent_dashboard/:id', to: 'parents#dashboard'
注意get之后的person字符串。这用作网站的地址,当用户点击它时,如果它是第一个仪表板,它将转到 localhost:3000/parent_dashboard/1
。如果您愿意,可以排除 :id
。当然,这与用例不同。
路由语法的第二部分是 :to
,此方法告诉您的应用程序要查看哪个控制器和方法。
希望对您有所帮助!
这样做:
#config/routes.rb
resources :parents do
get :dashboard, on: :collection #-> url.com/parents/dashboard
end
And is this the wrong way to add pages/actions to a rails application?
不是"wrong",它只是无效,正如你的问题所证明的那样。
您遇到的问题是您在resources :parents
路线下方 包含了您的自定义路线。因为 resources
创建了一个 /:id
url 来捕获发送到 parents/:id
的任何请求,你的 "dashboard" 请求被发送到parents 控制器:
您的问题有两种补救措施:
- 将
get 'parents/dashboard'
置于 resources :parents
指令之上
- 包括一个 additional route 到
resources :parents
(以上)
您必须记住 Rails 匹配 您的请求与路由。这意味着匹配您的请求的第一条路线已被处理。
所以如果你有...
#config/routes.rb
resources :parents
get "parents/dashboard"
...Rails 将假定 dashboard
是 url.com/parents/:id
中的 :id
,从而将请求发送到 show
.
除了最上面的代码(推荐的答案)之外,您可以具有以下内容:
#config/routes.rb
get "parents/dashboard", to: :dashboard
resources :parents
如果你想在parents文件夹中添加一个新视图。只需这样做:
parents_controller.rb
def dashboard
@parent = Parent.find(params[:id])
end
routes.rb
get '/parents/:id/dashboard', to: 'parents#dashboard', as: :parents_dashboards
resources :parents
然后在 parents/dashboard.html.erb
视图中,您可以执行在 parents/show 视图中可以执行的所有操作。
仪表板视图的 link 将是 parents_dashboards_path
,在某些情况下您可能必须使用 parents_dashboards_path(@parent)
或 parents_dashboards_path(parent)
。
这是自定义路径的示例,无需使用嵌套资源即可完成对父仪表板的访问。
我在一个项目中使用这种方法,所以我想听听对这种方法的任何批评或意见。和平,我要离开这里了!
我的情况 我有一个 "Parent" 模型和控制器。我想知道为用户添加独立页面(例如仪表板)的最佳做法。我的想法是我可以创建一个视图 dashboard.html.erb
并在父控制器内部创建一个方法:
父控制器
def dashboard
end
Routes.rb
get 'parents/dashboard'
我已经做过一次并且效果很好,但它是针对 'child' 模型的。
当我 运行 在父模型中遇到同样的情况时,我得到错误
ActiveRecord::RecordNotFound 在 ParentsController#show
无法使用 'id'=dashboard
找到父项1.) 我所做的只是添加一个视图,将 仪表板模型 添加到控制器,并放置 get 'parents/dashboard'
进入 routes.rb 并尝试引用 show 方法???为什么?
2.) 这是将 pages/actions 添加到 rails 应用程序的错误方法吗?
如果您想使用 :id
添加额外的路由,则语法不同。
get 'parent_dashboard/:id', to: 'parents#dashboard'
注意get之后的person字符串。这用作网站的地址,当用户点击它时,如果它是第一个仪表板,它将转到 localhost:3000/parent_dashboard/1
。如果您愿意,可以排除 :id
。当然,这与用例不同。
路由语法的第二部分是 :to
,此方法告诉您的应用程序要查看哪个控制器和方法。
希望对您有所帮助!
这样做:
#config/routes.rb
resources :parents do
get :dashboard, on: :collection #-> url.com/parents/dashboard
end
And is this the wrong way to add pages/actions to a rails application?
不是"wrong",它只是无效,正如你的问题所证明的那样。
您遇到的问题是您在resources :parents
路线下方 包含了您的自定义路线。因为 resources
创建了一个 /:id
url 来捕获发送到 parents/:id
的任何请求,你的 "dashboard" 请求被发送到parents 控制器:
您的问题有两种补救措施:
- 将
get 'parents/dashboard'
置于resources :parents
指令之上 - 包括一个 additional route 到
resources :parents
(以上)
您必须记住 Rails 匹配 您的请求与路由。这意味着匹配您的请求的第一条路线已被处理。
所以如果你有...
#config/routes.rb
resources :parents
get "parents/dashboard"
...Rails 将假定 dashboard
是 url.com/parents/:id
中的 :id
,从而将请求发送到 show
.
除了最上面的代码(推荐的答案)之外,您可以具有以下内容:
#config/routes.rb
get "parents/dashboard", to: :dashboard
resources :parents
如果你想在parents文件夹中添加一个新视图。只需这样做:
parents_controller.rb
def dashboard
@parent = Parent.find(params[:id])
end
routes.rb
get '/parents/:id/dashboard', to: 'parents#dashboard', as: :parents_dashboards
resources :parents
然后在 parents/dashboard.html.erb
视图中,您可以执行在 parents/show 视图中可以执行的所有操作。
仪表板视图的 link 将是 parents_dashboards_path
,在某些情况下您可能必须使用 parents_dashboards_path(@parent)
或 parents_dashboards_path(parent)
。
这是自定义路径的示例,无需使用嵌套资源即可完成对父仪表板的访问。
我在一个项目中使用这种方法,所以我想听听对这种方法的任何批评或意见。和平,我要离开这里了!