You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ruby on Rails中获取slug并将其用作页面body类?

在Ruby on Rails中为body标签添加页面slug作为class/ID

方法1:直接在布局中使用params[:slug]

如果你的路由已经配置为接收slug参数(比如get '/:slug', to: 'pages#show'或者resources :pages, param: :slug),可以直接在布局文件(通常是app/views/layouts/application.html.erb)的body标签里插入slug:

<!-- app/views/layouts/application.html.erb -->
<body class="<%= params[:slug] || 'default-page' %>">
  • params[:slug]会直接获取URL中的slug值
  • 用|| 'default-page'处理没有slug的页面(比如首页),避免class为空

如果需要设置唯一ID:

<body id="<%= params[:slug] || 'home-page' %>" class="<%= params[:slug] || 'default-page' %>">

方法2:用控制器辅助方法增强灵活性

如果需要处理更复杂的场景(比如嵌套路由、组合多个slug),可以在ApplicationController中定义一个辅助方法,让所有视图都能调用:

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  helper_method :body_identifier

  private

  def body_identifier
    # 处理嵌套路由,比如 /categories/:category_slug/posts/:post_slug
    slugs = [params[:category_slug], params[:post_slug], params[:slug]].compact
    slugs.empty? ? "#{controller_name}-#{action_name}" : slugs.join(' ')
  end
end

然后在布局中使用:

<body class="<%= body_identifier %>">

这个方法的好处:

  • 自动处理嵌套路由的多个slug,生成类似category-tech post-ruby-rails的class
  • 没有slug时,用控制器名-动作名(比如home-index)作为class,保证所有页面都有唯一标识

方法3:结合模型属性(如果slug存在于数据库)

如果你的页面数据存在数据库中(比如Page模型有slug字段),可以在控制器中获取模型实例后,把slug传递到视图:

# app/controllers/pages_controller.rb
class PagesController < ApplicationController
  def show
    @page = Page.find_by(slug: params[:slug])
  end
end

然后在布局中使用:

<body class="page-<%= @page&.slug || 'default-page' %>">
  • @page&.slug用安全导航操作符避免@page为nil时报错

样式使用示例

有了唯一class后,就可以针对特定页面写样式:

/* 针对about-us页面的hero区域 */
.about-us .hero {
  background-color: #f5f5f5;
}

/* 针对嵌套路由的tech分类下的ruby-rails文章 */
.category-tech.post-ruby-rails .content {
  font-size: 1.1rem;
}

内容的提问来源于stack exchange,提问作者Datustan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:38:13