添加非标准视图和控制器操作的最佳实践?

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 控制器:

您的问题有两种补救措施:

  1. get 'parents/dashboard' 置于 resources :parents 指令之上
  2. 包括一个 additional routeresources :parents(以上)

您必须记住 Rails 匹配 您的请求与路由。这意味着匹配您的请求的第一条路线已被处理。

所以如果你有...

#config/routes.rb
resources :parents
get "parents/dashboard"

...Rails 将假定 dashboardurl.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)

这是自定义路径的示例,无需使用嵌套资源即可完成对父仪表板的访问。

我在一个项目中使用这种方法,所以我想听听对这种方法的任何批评或意见。和平,我要离开这里了!