Link_to с дополнительной переменной - PullRequest
0 голосов
/ 03 января 2012

Я хочу создать простое 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 ]

2 голосов
/ 03 января 2012

Подобные вещи обязательно должны быть преобразованы в помощника, например,

# 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 }
0 голосов
/ 03 января 2012

Не очень элегантно, но должно работать:

- 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? }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...