2012-01-03 61 views
0

我想有兩個額外的變量創建一個簡單的link_to(軌道3):LINK_TO額外變量

= link_to 'Try', new_try_path(:k => users.collect{|m| m.user.username}, :h=> users2.collect{|m| m.user2.username2}, :proof => true) 

問題是如果users2爲空,則生成此HTML代碼:&k=[1]&&proof=true

我嘗試過這樣的事情。你能幫我嗎?

= link_to 'Try', new_try_path(:k => users.collect{|m| m.user.username}, :h=> users2.collect{|m| m.user2.username2} if users2.blank?, :proof => true) 

謝謝!

回答

0

不是很優雅,但應該工作:

- options = { :k => users.map{ |m| m.user.username }, :proof => true } 
-# add :h parameter only if users2 is not empty 
- options[:h] = users2.map{ |m| m.user2.username2 } unless users2.blank? 
= link_to 'Try, new_try_path(options) 

如果users2是空白h參數將生成的URL被省略。

作爲替代你可以從選項哈希篩選出空白值:

# for ruby 1.9 (select only non-blank values) 
options.select! { |k, v| v.present? } 

# for ruby 1.8 (delete blank values) 
options.delete_if { |k, v| v.blank? } 
2

像這樣的事情絕對應該重構爲一個幫手,如

# view 
= try_link(users, users2) 

# helper 
def try_link(users, users2) 
    options = { :k => users.collect { |m| m.user.username }, :proof => true } 
    unless users2.blank? 
    options[:h] = users2.collect { |m| m.user2.username2 } 
    end 

    link_to 'Try', new_try_path(options) 
end 

這大約是最起碼的你可以做的,使視圖代碼不太可怕。

您可能還想考慮將整個收集的東西放入模型中。

而且Hash#merge可能是這樣的,在那裏你可以做

a = { :foo => 1 } 
b = { :bar => 2 } 
puts a.merge(b) # => { :foo => 1, :bar => 2 } 
案件有幫助