路线范围/过滤器集合

时间:2013-05-13 13:16:53

标签: ruby-on-rails-3

我已为“发票”设置了标准的资源丰富路线设置,但我希望能够根据其状态添加过滤发票记录的功能。

/invoices - shows all invoices
/invoices/unpaid - shows all unpaid invoices
/invoices/paid - shows all paid invoices.
/invoices/3 - shows invoice #3

我使用明确定义的匹配路线没有问题。

match "/invoices/pending" => "invoices#index", :state => 'pending'

然而,随着越来越多的可能状态,这意味着定期修改路线,也意味着我重复了很多。

我的下一次尝试是在匹配路线中使用命名参数使这条路线更加动态。

match "/invoices/:state" => "invoices#index"

然而,这会否定/ invoices / id路由并尝试查找/ invoices / 3找不到记录,因为它正在根据状态参数进行搜索。

任何人都可以帮助定义一个过滤器路由,例如动态工作吗?

3 个答案:

答案 0 :(得分:1)

在路线中添加正则表达式作为约束:

match "/invoices/:id" => "invoices#show", :id => /\d+/
match "/invoices/:state" => "invoices#index"

它应该为show选择only-number id-s,其余为index。

答案 1 :(得分:0)

尝试使用路由constraints。像

这样的东西
match "/invoices/:id" => "invoices#show", constraint: { id: /\d+/ }
match "/invoices/:state" => "invoices#index", constraint: { state: /\w+/ }

答案 2 :(得分:0)

我决定采用一种稍微不同的路线(借口双关语),通过添加一个约束而不是使用REGEX使用一种方法来查看状态机上的可能状态。

# State based routes, which match the state machine dynamicly.
match "/invoices/:state" => "invoices#index", constraints: lambda { |r|
    # Get an array if potential state names.
    states = Invoice.state_machine.states.map &:name

    # See if the request state name matches or not.
    states.include?(r.params[:state].parameterize.underscore.to_sym)
}

# Resource routes go here.

这基本上意味着如果我现在去寻找/发票/付款或/发票/未付款,我会得到我预期的索引操作,状态变量设置为expecetd。

然而,执行/ invoices / pay_soon这样的非有效事件会返回404.

对这个解决方案非常满意,但感谢其他建议让我进入了使用约束的轨道。