正如标题所说,我正在尝试显示上/下箭头。目前正在构建Ruby 2.0 / Rails 4.0
我已经关注有关排序表列(http://railscasts.com/episodes/228-sortable-table-columns)的railscast,但当然他使用了表格,因此他的箭头显示得很好。
我想使用divs / spans /其他任何东西。 (这不是很多数据,而且不是那种需要在表格中的数据。)
话虽这么说,我为我的箭头制作了一个应用程序辅助方法,但是它们可以工作,但如果我点击一个asc,两个箭头都指向上方。如果我点击一个用于desc,两个都指向下方。显然因为params[:direction]
设置为asc或desc,所以两个箭头都被设置。我该如何分开它们?有点伪代码:
if title && asc
sort by title and asc && show up arrow (for title only)
if title && desc
sort by title and desc && show down arrow (for title only)
if date posted && asc
sort by created_by and asc && show up arrow (for date posted only)
etc.
我真的不想拥有一个巨大的if / then条件声明,但想要更简单的东西。
(如果推动推进,我只会使用一个表格来排序:部分,但这看起来真的非常愚蠢,这有点不得已......)
这是我得到的代码:
show.html.erb
<h3>Images</h3>
<% if @user.images.any? %>
<div class="sortable"><%= sortable "img_name", "Title" %><%= arrow %> |
<%= sortable "created_at", "Date posted" %><%= arrow %>
</div>
<%= render @images %>
<%= will_paginate @images %>
<% end %>
application_helper.rb
def sortable(column, title = nil)
title ||= column.titleize
css_class = column == sort_column ? "current #{sort_direction}" : nil
direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
link_to title, {sort: column, direction: direction}, {class: css_class}
end
def arrow
if params[:direction] == 'asc'
image_tag("arrow_up.png", alt: "up arrow", size: "15x15")
elsif params[:direction] == 'desc'
image_tag("arrow_down.png", alt: "down arrow", size: "15x15")
else
# either a blank image to show or just force no-display of image
end
end
users_controller.rb
def show
@user = User.find(params[:id])
@images = @user.images.paginate(page: params[:page]).order(sort_column + " " + sort_direction)
end
private
def sort_column
Image.column_names.include?(params[:sort]) ? params[:sort] : "created_at"
end
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
end
答案 0 :(得分:1)
我不理解你不愿意在这里使用表格。即使它是一个小表,这个仍然是表格数据,包含行,列和标题。为什么用类 div结构替换语义表结构?
话虽这么说,我会扩展箭头助手以发送箭头所在的列:
def arrow(column)
# as you're not sorting on the column, you don't want to see the arrow at
# all of the header is not for the sorted column
return '' if params[:sort] != column
# ...
end
导致模板看起来像:
<%= sortable "img_name", "Title" %><%= arrow "img_name" %>
虽然你会在这里注意到一些不必要的重复。由于这两个助手总是被召集在一起,所以他们也可以加入:
def sortable(column, title=nil)
# ...
capture do
concat link_to(title, {...})
concat " "
concat arrow(column)
end
end
导致更简单的模板:
<%= sortable "img_name", "Title" %>
答案 1 :(得分:1)
如果其他人想要使用glyphicon而不是像我这样的图像,这个解决方案可能会有用。在这个例子中,我使用的是FontAwesome
<强> application_helper.rb 强>
def sortable(column, title = nil)
title ||= column.titleize
css_class = column == sort_column ? "current #{sort_direction}" : nil
direction = column == sort_column && sort_direction == 'asc' ? 'desc' : 'asc'
capture do
link_to({sort: column, direction: direction}, {class: css_class}) do
concat title
concat " "
concat arrow(column)
end
end
end
def arrow(column)
return '' if params[:sort] != column
arrow = params[:direction] == 'asc' ? 'down' : 'up'
"<i class='fa fa-caret-#{arrow}'></i>".html_safe
end
<强> show.html.erb 强>
<%= sortable "img_name", "Title" %>