出于 UI 的目的划分 Rails 编辑视图

Dividing a Rails edit view for the purposes of UI

所以我有一个 'Project' 模型,相应的数据库 table 有很多属性。

理想情况下,当我点击 projects/1/edit 时,我希望用户:

  1. 只能查看和编辑项目属性的一部分
  2. 看到一个导航菜单,允许她导航到另一个视图,允许查看和编辑左边的属性。

所有这些而不是在一个 'edit' 视图中显示所有属性。

我倾向于在单击菜单时隐藏和显示特定属性的 JS 解决方案。但是,理想情况下,我希望 urls 反映用户所在的部分,例如:

而不是像 projects/1/edit 这样的 url 我想要这样的东西: projects/1/edit/name_of_section_1projects/1/edit/name_of_section_2

无论如何,我想知道在像这样划分视图时最佳做法是什么。

更新:以下 Dan 的解决方案中只有少数 precisions/revisions 供将来参考

我已经使用他的第二种方法成功地修改了他提议的代码如下:

Config/routes.rb 将两条路线的控制器名称修改为'projects'

resources :projects do
    member do
      get "settings/:panel" => "projects#edit", as: :settings
      patch "settings/:panel/update" => "projects#update", as: :update_settings
    end
end

Controllers/projects_controller.rb 建议的编辑操作代码中存在一些错误,因此我稍微更改了它以使其工作

  def edit
    panel = ['general', 'invitations', 'welcome_message', 'danger'].detect{|p| p == params[:panel] }
    render template: "projects/#{panel}.html.erb" if panel
  end

有几种方法可以做到这一点,而且都同样有效。 如果您需要填写所有字段来创建记录,您需要使用 javascript 选项卡式视图(bootstrap 有一个很好的插件)

要使用自定义路由执行此操作,您可以: resources :projects do member do get "settings" patch "update_settings" get "settings2" patch "update_settings2" end end

这会给你像 /projects/1/settingsprojects/1/update_settings

这样的 URL

如果你有很多面板,你可以用这样的方法更有效地做到这一点:

resources :projects do
  member do
    get "settings/:panel" => "settings#edit" as: :settings
    patch "settings/:panel/update" => "settings#update" as: :update_settings
  end
end

允许 /projects/1/settings/page1/projects/1/settings/page2

这样的路由

在你的控制器中你可以有:

def edit
  if panel = ['page1', 'page2'].detect{|p| p == params[:panel] }
    render template: panel
  end
end

这会检查它是否是您制作的有效面板,然后呈现您在 app/view/projects/page1 中创建的特定模板。html.erb