2010-03-06 8 views
6

Chcę umożliwić moim użytkownikom wybór sposobu wyświetlania ich strony publicznej z 5 różnych układów. Zakładam, że będę potrzebował 5 różnych plików CSS zgodnie z układem, a następnie muszę przekazać to do styleheet_link_tagUmożliwianie użytkownikom wybierania niestandardowego motywu w Railsach

Wiem tylko jak to zrobić, używając instrukcji if. Nie sądzę, że to najlepszy sposób. Każda pomoc ... czy można to zrobić?

Dzięki

Odpowiedz

11

należy przechowywać układ, że użytkownik wybrał w zmiennej sesji (najprostszy, ale utracone, gdy użytkownik ściąga pliki cookie lub korzysta z innego komputera) lub w bazie danych.

Powiedzmy arkusze stylów mają pięć nazwisk, z których każda odpowiada kolor:

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

umieszczenie tych plików wewnątrz public/stylesheets.

Store wyboru użytkownika w arkuszu stylów do session[:style] zmiennej tak:

session[:style] = 'green' 

Wartość ta będzie obowiązywać tak długo, jak długo użytkownik nie usunie plików cookie.

Utwórz plik application.erb w swoich układach, jeśli jeszcze nie istnieje. Kod w tym pliku będzie renderowany dla każdego szablonu w Twojej witrynie. Powinien zawierać linię, taką jak <%= yield %>. W tym pliku miejsce następujące:

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

To jest to!

Powodzenia!

+0

Przykro mi, że nie podałem poprawnie pytania. Chodziło mi o to, by użytkownik mógł wybrać motyw, który będzie obowiązywać dla jego strony, niezależnie od tego, kto odwiedził ich stronę, a nie tylko dla nich. Ale <% = stylesheet_link_tag session [: style] + '_ stylesheet'%> jest tym, czego szukałem. Sądzę, że powinienem zezwolić użytkownikowi na ustawienie preferencji w profilu, a następnie zastąpienie [: style] przez @ user.theme? Czy to zadziała? Dzięki –

4

Najpierw spróbuj dodać pole "tematu" do modelu użytkownika (korzystając z migracji).

Następnie dodać kilka linków w widoku (ustawienia użytkownika):

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

Kontroler:

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

publicznym profilu użytkownika:

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

układ:

<%=stylesheet_link_tag @theme %> 
Powiązane problemy