2012-03-10 30 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'