2012-01-03 63 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 } 
案件有帮助