dumP
dumP

Reputation: 801

Link_to with additional variable

I want to create a simple link_to (rails 3) with two additional variables:

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

The problem is if users2 is blank, this html code is generated: &k=[1]&&proof=true

I tried something like this. Can you help me please?

= 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)

Thank you!

Upvotes: 0

Views: 238

Answers (2)

KL-7
KL-7

Reputation: 47678

Not very elegant, but should work:

- 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)

If users2 is blank h parameter will be omitted from generated URL.

As alternative you can filter out blank values from options hash:

# 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? }

Upvotes: 0

Jakub Arnold
Jakub Arnold

Reputation: 87260

Things like this should definitely be refactored into a helper, such as

# 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

This is about the bare minimum you can do to make the view code less horrible.

You might also want to consider putting the whole collect thing into the model.

Also Hash#merge might be helpful in cases like this, where you can do

a = { :foo => 1 }
b = { :bar => 2 }
puts a.merge(b)  # =>   { :foo => 1, :bar => 2 }

Upvotes: 2

Related Questions