передача булевых параметров в именованные маршруты в рельсах - PullRequest
1 голос
/ 21 мая 2009

Я хочу явно передать логическое значение false в params [: closed], и у меня есть что-то вроде этого:

= link_to 'appointments', appointments_path(:closed => false)

Но это не работает, так как рельсы обрабатывают ложное логическое значение, так как я не хочу, чтобы что-то было установлено для этих параметров, есть ли способ обойти это?

обновление: ложное значение, которое я передаю, является логическим, и я хочу URL-адрес, подобный этому

\appointments?closed=false

но все, что я получаю, это просто \ назначения. Надеюсь, это немного яснее.

Дополнительный вопрос, является ли хорошей практикой передача логических значений в качестве параметров?

Ответы [ 3 ]

3 голосов
/ 03 октября 2009

Возможно, уже слишком поздно, но попробуйте вместо этого использовать строку:

appointments_path(:closed => 'false')
0 голосов
/ 30 октября 2009

Похоже, вам нужно 3 разных варианта. Закрыто не выбрано, закрыто установлено в true или установлено в false.

Если вам нужно отличить закрытый от невыбранного и установить в ложь, как это, вам нужно просто использовать строки и params[:closed] == 'false'. Если бы у rails был какой-то улов, который переводил бы строку URL-адреса в логическое значение, вы бы не смогли передать строку "false" как параметр, который был бы странным.

Если ваш закрытый параметр ВСЕГДА будет истинным или ложным (без невыбранной опции), тогда делать это так, как вы, - хорошо.

Вы указываете его в методе _path с помощью :closed => true или :closed => false, а затем проверяете его с помощью params[:closed] как в:

if params[:closed]
  blah
else
  other_blah
end
0 голосов
/ 21 мая 2009

Это приведет к? Closed = false. params[:closed] вернет "false", что является строкой, и получит значение true.

Я бы использовал для этого именованные маршруты вместо маниакальной проверки if / else в действии index.

# routes.rb
map.resources :appointments, :collection => {:closed => :get, :open => :get}

# controller
def closed
  @appointments = Appointment.closed
end

def open
  @appointments = Appointment.open
end
...