所以,我幾乎是創建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