Link_to与其他变量

时间:2012-01-03 10:49:29

标签: ruby ruby-on-rails-3 link-to

我想用另外两个变量创建一个简单的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)

谢谢!

2 个答案:

答案 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? }