出于 UI 的目的划分 Rails 编辑视图
Dividing a Rails edit view for the purposes of UI
所以我有一个 'Project' 模型,相应的数据库 table 有很多属性。
理想情况下,当我点击 projects/1/edit
时,我希望用户:
- 只能查看和编辑项目属性的一部分
- 看到一个导航菜单,允许她导航到另一个视图,允许查看和编辑左边的属性。
所有这些而不是在一个 'edit' 视图中显示所有属性。
我倾向于在单击菜单时隐藏和显示特定属性的 JS 解决方案。但是,理想情况下,我希望 urls 反映用户所在的部分,例如:
而不是像 projects/1/edit
这样的 url 我想要这样的东西:
projects/1/edit/name_of_section_1
和 projects/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/settings
和 projects/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
所以我有一个 'Project' 模型,相应的数据库 table 有很多属性。
理想情况下,当我点击 projects/1/edit
时,我希望用户:
- 只能查看和编辑项目属性的一部分
- 看到一个导航菜单,允许她导航到另一个视图,允许查看和编辑左边的属性。
所有这些而不是在一个 'edit' 视图中显示所有属性。
我倾向于在单击菜单时隐藏和显示特定属性的 JS 解决方案。但是,理想情况下,我希望 urls 反映用户所在的部分,例如:
而不是像 projects/1/edit
这样的 url 我想要这样的东西:
projects/1/edit/name_of_section_1
和 projects/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/settings
和 projects/1/update_settings
如果你有很多面板,你可以用这样的方法更有效地做到这一点:
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