2010-03-06 2 views
6

Я хочу, чтобы мои пользователи могли выбирать, как отображается их общая страница из 5 различных макетов. Я предполагаю, что мне понадобятся 5 разных файлов css в соответствии с макетом, а затем нужно передать их в stylesheet_link_tagПозволяет пользователям выбирать собственную тему в Rails

Я знаю только, как это сделать, используя инструкции then. Я не думаю, что это лучший способ. Любая помощь ... и это можно сделать?

Благодаря

ответ

11

Вы должны хранить макет, который пользователь выбрал в переменной сессии (простой, но потеряли, когда пользователь очищает куки или использует другой компьютер), или в базе данных.

Позволяет сказать, что таблицы стилей имеют пять имен, каждое из которых соответствует цвету:

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'%>

Вот оно!

Удачи вам!

+0

Извините, я не задал вопрос правильно. Я имел в виду позволить пользователю выбрать тему, которая будет сохраняться для их страницы независимо от того, кто посетил их страницу, а не только для них. Но, <% = stylesheet_link_tag session [: style] + '_ stylesheet'%> - это то, что я искал. Думаю, я должен позволить пользователю установить предпочтение в профиле, а затем просто заменить [: style] на @ user.theme? Будет ли это работать? Спасибо –

4

Сначала попробуйте добавить поле темы к модели пользователя (используя миграции).

Затем добавьте несколько ссылок в представлении (настройки пользователя):

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 %> 
Смежные вопросы