我有一个带侧边栏的用户个人资料页面。我需要在配置文件中创建更多页面。例如,编辑密码,编辑个人资料信息,统计信息,购买历史记录列表等。我不确定如何在保持干燥的同时继续进行。除了主要内容之外,我试图让一切都完全相同。在浏览一些教程时,我遇到了yield
,但它主要用于application.html.erb
来渲染导航,页脚等。我不明白如何将它用于" sub -views"
我现在这样做的方式似乎是错误的。
路线:
as :user do
# Routes to change password of signed in user
get 'user/password' => 'users/registrations#edit_password', as: 'edit_password'
# Routes to change user profile information of signed in users
get 'user/profile' => 'users/registrations#edit_profile', as: 'user_profile'
end
查看:
views\users\show.html.erb
:
views\users\registrations\edit_profile.html.erb
:
views\users\registrations\edit_password.html.erb
:
全部包含此1行
<%= render 'users/shared/profile' %>
views\users\shared\profile
:
<%= render 'users/profile/sidebar' %>
<!-- Display Profile or Password based on route -->
<% if current_page?(user_path current_user) %>
<!-- User Profile -->
<%=render 'users/profile/adminPanels' %>
<% elsif current_page?(edit_password_path) %>
<!-- Password Reset -->
<%=render 'passwordForm' %>
<% else %>
<!-- Profile Edit -->
<%= render 'users/registrations/profileForm' %>
<% end %>
基本上我想要做的是保留所有周围的布局,但更改渲染的内容。现在我需要添加更多,扩展这个if语句似乎真的是错误的方法。
答案 0 :(得分:0)
从您提供的代码段开始,DRYest方式就是移动
<%=render 'users/profile/adminPanels' %>
渲染show.html.erb
后直接转到shared/profile
页面。其他观点也是如此。
答案 1 :(得分:0)
是的,这绝对不是一种可行的方式,但是你认识到这一点并不令人担忧,这很好。正如您猜测的那样,执行此操作的方法涉及使用布局和yield
。您可以在this Rails guide中了解收益率。
虽然您可以使用默认情况下整个Rails应用程序使用的application.rb
等布局,但您也可以定义嵌套在此布局中的布局。这与上面的towards the bottom相同的Rails指南中描述。
这样,整个应用程序的相同内容在application
布局中定义,对于用户配置文件的所有内容都相同的内容在users
布局中定义,并且在那里定义了特定于每个视图的东西。
旁注:,因为users
文件夹位于layouts
文件夹中,我的行为就好像你移动了_sidebar
部分一样,因为它是真的是属于布局的部分,应该靠近它。
<强>视图/布局/ users.html.erb 强>
<%= render '_sidebar' %>
<%= yield :users_content %>
<%= render template: 'layouts/application' %>
<强>视图/用户/ show.html.erb 强>
<% content_for :users_content do %>
put the view code specific to users/show here
<% end %>
<强>视图/用户/注册/ edit.html.erb 强>
<% content_for :users_content do %>
put the view code specific to editing a user registration here
<% end %>
等
你唯一可能遇到的问题是Rails使用控制器的名称来匹配嵌套的users
布局,如果那个&#39; sa可能会破坏registrations
的内容不同控制器。您可以通过在这些控制器操作中显式调用render template: 'layouts/users'
来解决此问题。