Configuración condicional del estilo CSS desde el controlador ruby

Estoy intentando cambiar dinámicamente (si se hizo clic) un encabezado de tabla normal (que es un enlace) a otra clase de CSS definida ‘th.hilite’. Este enlace simplemente ordena esta columna y el encabezado debe resaltarse cada vez que un usuario ordena la lista.

La vista donde se debe cambiar la clase en cuestión, se ve así:

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

Mi pregunta es simple: ¿Cómo y dónde puedo configurar dinámicamente la clase a% th.hilite si se hace clic en el encabezado?

Tenga cuidado de no incluir lógica (incluso condicionales) en sus vistas si puede encontrar una forma de evitarlo. Para evitar este error común, debe hacer un buen uso de los parámetros y hashes de sesión y establecer las variables apropiadas en los controladores.

 # 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 

Puedes enlazarlo directamente desde la vista:

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

Sin embargo, también deberá declarar la variable de instancia @sort en su controlador y establecerla en título o lanzamiento , según la columna que esté clasificando. (es decir, @sort = params[:sort] )

Por cierto, siempre y cuando los valores de su parámetro coincidan con el nombre de la columna, no es necesario codificar cada uno

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

Javascript o jquery no es requerido ..

El siguiente HAML funcionará

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

Debes usar JavaScript para hacer esto. Creo que es una buena idea que uses jQuery en lugar de JavaScript puro. Aquí hay unos ejemplos

http://api.jquery.com/click/

http://api.jquery.com/css/