将布尔参数传递给rails中的命名路由

时间:2009-05-21 11:06:55

标签: ruby-on-rails parameters boolean params

我想显式地将布尔值false传递给params [:closed],我有类似的东西:

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

但是这不起作用,因为rails正在处理一个错误的布尔值,因为我不想为这个参数设置任何东西,有没有办法解决这个问题?

更新:我传入的错误是一个布尔值,我想要一个这样的网址

\appointments?closed=false

但我得到的只是\约会。希望这更清楚一点。

附带问题,将布尔作为params传递是一种好习惯吗?

3 个答案:

答案 0 :(得分:3)

现在可能为时已晚,但请尝试使用字符串:

appointments_path(:closed => 'false')

答案 1 :(得分:0)

听起来你需要3种不同的选择。未选中已关闭,已关闭设置为true或设置为false。

如果您需要区分已关闭和未被选中并将其设置为false,则需要使用字符串和params[:closed] == 'false'。如果rails有一些将url字符串转换为布尔值的catch,则无法将字符串"false"作为参数传递,这很奇怪。

如果您的关闭参数总是为真或假(没有未选择的选项),那么就像你正在做的那样就可以了。

您可以使用:closed => true:closed => false在_path方法中指定它,然后使用params[:closed]进行测试,如下所示:

if params[:closed]
  blah
else
  other_blah
end

答案 2 :(得分:0)

这将导致?closed = false。然后,params[:closed]将返回"false",这是一个字符串,并将评估为true。

我会使用命名路由,而不是manic 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