【发布时间】:2014-08-05 15:23:32
【问题描述】:
使用 Rails (4.1.4) 和 Ruby (2.1.2),根据不同的控制器操作实现不同背景图像的最干方法是什么?我是否需要将 HTML 代码标签移出 /app/views/layouts/application 并将它们移到单独的视图页面中,或者有更好的方法吗?
【问题讨论】:
标签: ruby-on-rails image methods background controller
使用 Rails (4.1.4) 和 Ruby (2.1.2),根据不同的控制器操作实现不同背景图像的最干方法是什么?我是否需要将 HTML 代码标签移出 /app/views/layouts/application 并将它们移到单独的视图页面中,或者有更好的方法吗?
【问题讨论】:
标签: ruby-on-rails image methods background controller
您可以使用content_for 方法。 described here
基本上,在您的布局中,您可能有
<body class="<%= yield @body_class %>">
那么在你看来你可以这样做
<% content_for :body_class do 'class-name' end %>
<!-- regular view HTML -->
【讨论】:
只需根据您的操作名称在您的元素上使用不同的类,然后在这些类上应用不同的背景图像
Rails 有 controller_name 和 action_name 帮助器来获取您的控制器名称和操作名称,因此您可以:
<div class="<%= 'class_name' if action_name == 'show' %>">
</div>
如果您想使用与控制器操作相同的类名,那么您可以这样做
<div class="<%= action_name %>">
</div>
如果您对不同的控制器使用相同的布局,那么您可以利用 rails controller_name 和 action_name 来创建一个独特的类,例如:
<div class="<%= controller_name action_name %>">
</div>
然后相应地使用 css,假设你有家庭控制器和新的并显示动作然后你可以做
.home.show{
background: image-url("pic1.png");
}
.home.new{
background: image-url("pic2.png");
}
【讨论】:
controller_name 会有所帮助。您的原始答案没有指定使用 controller_name 来帮助打击可能的重复,这就是我评论的原因。我在这里假设他对不同的控制器使用相同的布局。不过不用担心,我更喜欢这个答案而不是我的答案,因为我有冗余。
你可以在元素上添加动态类名(应该有bg img)
# your '.html.erb' template
<body class="<%=controller_name%>-<%=action_name%>">
...
</body>
# your css file
// for user_controller's 'new' action
body.user-new {
background-image: url(http://cdn.topshelfcomix.com/catalog/covers/any_empire_cover_sm_lg.jpg);
}
// for profiles_controller's 'show' action
body.profile-show {
background-image: url(http://mrzine.monthlyreview.org/2011/images/latuff_egypt_by_any_means_necessary_a.gif);
}
就是这样......享受吧!
【讨论】: