2012-03-10 72 views
7

我想動態改變(如果它被點擊)一個普通的表頭(這是一個鏈接)到另一個定義的CSS類'th.hilite'。這個鏈接只是對這個列進行排序,每次用戶對列表進行排序時,標題都應該被突出顯示。從紅寶石控制器有條件地設置CSS樣式

如有關的類應該改變的觀點,看起來是這樣的:

%table#mytable 
    %thead 
    %tr 
     %th= link_to 'Title', mytable_path(:sort => 'title'), :id => 'title_header' 

我的問題很簡單:如何以及在哪裏我能動態設置類%th.hilite如果標題是點擊?

+0

你不得不這樣做在Javascript,而不是紅寶石。 – 2012-03-10 13:28:23

+20

您不應該直接從saas-class.org homework 2作業發佈問題。你應該問如何做某事......但不是你的問題的確切答案。 – Ilan 2012-03-10 22:01:17

+7

最重要的是,你不應該發佈上面的代碼,直接顯示如何回答問題的一部分。它只是不好的行爲。 – Ilan 2012-03-10 22:29:14

回答

14

如果你能找到解決方法,注意不要在你的視圖中放置邏輯(偶條件)。爲了避免這種錯誤,你需要利用好PARAMS和會話哈希值,並設置相應的變量在控制器

# In your view 
%th{:class => @title_header}= link_to 'Title', my_path(:sort => 'title'), :id => 'title_header' 

# In your controller 
sort = params[:sort] || session[:sort] 
if sort == 'title' 
    ordering = {:order => :title} 
end 
+0

如果你想知道爲什麼|| session [:sort],那是因爲你可以點擊除了可排序的列之外的東西,這種情況下,您不希望排序因爲您的參數散列已過期而被撤消。你還需要一些控制器中的邏輯,比如「if params [:sort]!=會話[:排序]然後會話[:排序] =排序「類型的東西 – mehtunguh 2012-08-07 03:32:47

+0

我試圖理解這個答案在文檔中的哪裏可以閱讀有關」什麼?「瞭解如何title_header可以有不同的值每一個? – Alisso 2014-05-27 09:13:58

26

您可以直接從該視圖將它綁定:

%th{:class => ("hilite" if @sort == "title")}= link_to 'Movie Title'...

但是,你也必須申報@sort實例變量在您的控制器,並將其設置爲標題版本,根據你正在排序的列。 (即@sort = params[:sort]

+3

實際上你不必聲明一個實例變量,你可以簡單地使用params [:sort] – Sudhi 2012-03-12 05:35:28

3

順便說一句,只要你的PARAM匹配列名的值 - 不需要每一個

def index 
    @by=params[:by] 
    @movies = Movie.order(params[:by]).all 
    end 
3

JavaScript代碼或不需要jQuery的..

以下HAML將工作

%th{:class=>('title' == @sortby)?'hilite':""}= link_to 'Movie Title', movies_path(:sort => 'title'), :id => 'title_header'