Ruby on Rails中如何在_new_web.html.erb排除应用布局容器
解决Ruby on Rails Devise登录布局跳过特定容器的问题
嘿,作为Rails新手遇到这种布局卡点太正常了,我给你几个不用碰Devise控制器、直接在_new_web.html.erb里就能搞定的办法:
方法1:手动重构布局,跳过继承里的容器
如果你的application.html.erb里包含那个麻烦的容器,不用硬啃继承逻辑,直接在_new_web.html.erb里写完整布局,选择性复用你需要的部分就行:
<!DOCTYPE html> <html> <head> <!-- 复用application里的头部资源 --> <%= render 'layouts/head' %> </head> <body> <!-- 复用头部导航 --> <%= render 'layouts/header' %> <!-- 这里直接渲染登录内容,彻底跳过讨厌的容器 --> <%= yield %> <!-- 复用底部 --> <%= render 'layouts/footer' %> </body> </html>
这种方式完全由你掌控登录页的结构,不用受application布局里的容器限制。
方法2:给application布局加条件判断
要是你还是想保留布局继承,可以在application.html.erb里给容器加个判断,当当前是登录页且使用_new_web布局时,就不渲染容器:
<!DOCTYPE html> <html> <head> <%= render 'layouts/head' %> </head> <body> <%= render 'layouts/header' %> <% # 针对Devise登录页跳过容器 %> <% if controller.controller_path == 'devise/sessions' && controller.action_name == 'new' %> <%= yield %> <% else %> <div class="troublesome-container"> <%= yield %> </div> <% end %> <%= render 'layouts/footer' %> </body> </html>
这里通过判断控制器路径(Devise登录对应devise/sessions)和动作(登录页是new)来针对性处理,不用改你的_new_web布局,只要确保登录页使用该布局即可。
方法3:用content_for替换容器内容
先在application.html.erb里把容器的内容改成可替换的:
<div class="troublesome-container"> <%= yield :main_content || yield %> </div>
然后在_new_web.html.erb里提前定义main_content,让它直接输出登录内容,跳过容器:
<% content_for :main_content do %> <%= yield %> <% end %> <!-- 正常继承application布局 --> <%= render template: 'layouts/application' %>
这样application布局会优先使用你定义的main_content,自然就绕开了那个容器。
顺便提一句:你找不到Devise控制器是因为它默认在gem包里,要是以后需要自定义登录逻辑,用rails generate devise:controllers users就能生成自己的控制器,不过这次咱们不用这么麻烦,上面的方法足够解决问题啦!
内容的提问来源于stack exchange,提问作者Capitan Duke
相关产品推荐
相关产品推荐

