所以,我几乎是创建ruby方法的新手。我从gem(meta_search)获得了以下方法,但我需要更改默认行为。以下是方法:Ruby/Rails方法帮助
def sort_link(builder, attribute, *args)
raise ArgumentError, "Need a MetaSearch::Builder search object as first param!" unless builder.is_a?(MetaSearch::Builder)
attr_name = attribute.to_s
name = (args.size > 0 && !args.first.is_a?(Hash)) ? args.shift.to_s : builder.base.human_attribute_name(attr_name)
prev_attr, prev_order = builder.search_attributes['meta_sort'].to_s.split('.')
current_order = prev_attr == attr_name ? prev_order : nil
new_order = current_order == 'asc' ? 'desc' : 'asc'
options = args.first.is_a?(Hash) ? args.shift : {}
html_options = args.first.is_a?(Hash) ? args.shift : {}
css = ['sort_link', current_order].compact.join(' ')
html_options[:class] = [css, html_options[:class]].compact.join(' ')
options.merge!(
builder.search_key => builder.search_attributes.merge(
'meta_sort' => [attr_name, new_order].join('.')
)
)
link_to [ERB::Util.h(name), order_indicator_for(current_order)].compact.join(' ').html_safe,
url_for(options),
html_options
end
此方法返回搜索的排序链接。输出看起来是这样的:
<a class="sort_link asc" href="/photos?search[meta_sort]=average_rating.desc">Best Photography ▲</a>
这里的问题:这种方法假定您想按升序进行排序第一次点击,并在第二降序排列。我想要相反的行为。我看到,我可以改变这个...
new_order = current_order == 'asc' ? 'desc' : 'asc'
这个...
new_order = current_order == 'desc' ? 'asc' : 'desc'
...但只是反转的情况。我真正需要的是能够指定一个选项并在该选项通过时反转行为。
所以这里是我的问题:我真的不明白如何通过*参数。从我可以告诉这些线路正在服用的选项,html_option哈希为Rails的link_to方法...
options = args.first.is_a?(Hash) ? args.shift : {}
html_options = args.first.is_a?(Hash) ? args.shift : {}
我希望做的是一个自定义的选项添加到选项哈希值,并且如果该选项定义反转排序方程。我试图做到这一点...
if defined? options[:sort_preference] && options[:sort_preference]==:desc
new_order = current_order == 'desc' ? 'asc' : 'desc'
options.delete(:sort_preference)
else
new_order = current_order == 'asc' ? 'desc' : 'asc'
options.delete(:sort_preference)
end
...但没有奏效,它只是不停的标准行为,并通过:sort_preference到URL像这样:
<a class="sort_link asc" href="/photos?search[meta_sort]=average_rating.desc&sort_preference=desc">Best Photography ▲</a>
在上面的链接,sort_preference
不应该出现在URL中,并且search[meta_sort]
应该是average_rating.asc
- 因为链接显示与呈现的内容相反。
所以,显然,我的尝试没有奏效,因为我不太明白这种方法发生了什么。就是我在回答希望对这个问题是:
- 了解如何* ARGS一点帮助工作
- 为什么我尝试的选项添加到该方法的解释未能
- 的例子如何修复它
非常感谢您的参观!
要回答你的问题,调用代码为:'= sort_link @search ,:average_rating,“Best Photography”,:sort_preference =>:desc' – Andrew 2011-04-04 03:26:30
好吧,我现在明白了 - 我需要移动'options = args.first.is_a?(Hash)? args.shift:{}'为了使我的if语句正常工作。一旦这条线向上移动,它就会起作用。感谢您的解释,这对我们有很大帮助! – Andrew 2011-04-04 04:38:12