允许用户在Rails中选择自定义主题

时间:2010-03-06 08:14:02

标签: ruby-on-rails themes

我希望让我的用户能够从5种不同的布局中选择公共页面的显示方式。我假设根据布局我需要5个不同的css文件,然后需要将它传递给stylesheet_link_tag

我只知道如何使用if then语句。我不认为这是最好的方式。任何帮助......也可以吗?

由于

2 个答案:

答案 0 :(得分:11)

您应该在会话变量中存储用户选择的布局(最简单,但在用户清除cookie或使用其他计算机时丢失),或者存储在数据库中。

假设样式表有五个名称,每个名称对应一种颜色:

blue_stylesheet.css
green_stylesheet.css
red_stylesheet.css
orange_stylesheet.css
white_stylesheet.css

将这些文件放在public/stylesheets.

将用户选择的样式表存储到session[:style]变量中,如下所示:

session[:style] = 'green'

只要用户没有清除其Cookie,此值就会一直存在。

如果尚未存在,请在布局中创建application.erb文件。将为您网站上的每个模板呈现此文件中的代码。它应该包含<%= yield %>之类的行。在此文件中放置以下内容:

<%=stylesheet_link_tag session[:style]+'_stylesheet'%>

就是这样!

祝你好运!

答案 1 :(得分:4)

首先,尝试将'theme'字段添加到用户的模型中(使用迁移)。

然后在视图中添加一些链接(用户的设置):

link_to 'Change to green theme', :controller => "user", :action => "set_theme", :id => "green"

控制器:

def set_theme
  # don't forget to check, is there a theme with such params
  current_user.update_attributes :theme => params[:id]
end

公开个人资料的控制人:

def public_profile
  @theme = 'default'
  user = User.find(params[:user_id]) # profile's owner
  @theme ||= user.theme # overriding default theme to custom one
end

布局:

<%=stylesheet_link_tag @theme %>