我想用另外两个变量创建一个简单的link_to(rails 3):
= 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 :(得分: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 }
答案 1 :(得分: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
参数将从生成的网址中省略。
作为替代方案,您可以从选项哈希中过滤掉空白值:
# 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? }