【问题标题】:Handling different routes (with different params) for the same controller为同一个控制器处理不同的路由(具有不同的参数)
【发布时间】:2012-07-24 06:38:15
【问题描述】:

问题描述:

我有一个中间表 X,用于将表 A 中的元素映射到表 B 中的元素。

此表 X 还包含许多关于此映射属性的列。表 X 中记录的唯一性不仅是 id od A 和 id od B,而且是表示映射关系的唯一标识符。

在尝试更新表 X 的属性时,我添加了路由:

map.A :only=>[:none] do |a|
    a.resources B :controller=>X :only[:update]
end

map.resources x :only=>[:update]

所以这基本上给了我可能的 url 来访问我的 X 控制器的更新方法。

问题:

我的问题是:如何通过传递 A 和 B 或仅传递 X 标识符来判断何时访问控制器?我知道查看参数我可以检查 A 是否存在,如果不存在,那么它必须是 X,但这不是很实用/安全。如果它变得更复杂,我将需要多个 if 来检测确切的情况。

更糟糕的是,想象一下由于某种原因我有另一条路线,例如:

map.resources Y :controller=>X :only[:update]

然后在我的参数哈希中,我将只有 :id 所以如果条件甚至不起作用...

评论:

我希望路由有一个:key 选项,这样您就可以重命名参数哈希中的键,但从我在 Rails 2 中读到的内容来看,没有这样的事情,如果可能的话,我想避免使用插件。没有比 if 案例或解析 url 来告诉传递哪些参数以便我可以查找我的数据库更好的方法吗?

谢谢!!!

【问题讨论】:

    标签: ruby-on-rails model-view-controller controller routes


    【解决方案1】:

    似乎就像一个案例,如果您非常担心,您实际上希望有两个不同的操作来处理这些案例,但是您可以解决这个问题通过使用默认散列 -- http://guides.rubyonrails.org/routing.html#defining-defaults -- 来指定一个参数,该参数告诉您要遵循哪个参数来处理相同的情况。

    我所说的两个不同的操作是指在路由中有一个:action => update_from_a,除了普通的:update 方法之外,在控制器中有一个适当的方法。其中一些建议可能是特定于 Rails 3 的。

    【讨论】:

    • 嗯,这就是我最初的方式,但出于最佳实践的目的并遵循 ​​RESTful 指南,我正在更新 X 的状态,因此这应该是对特定资源的 PUT 请求(a在这种情况下是唯一的 X),无论您要更新什么属性。我认为这也将节省代码并且更合乎逻辑。
    • 通过这种方式设置,对于外部世界,您提供的是单一资源,而内部只有两个单独的操作。我在答案中提出“非常关注”的原因是,根据参数确定要做什么是很好的。这在很大程度上取决于您的品味和风格。
    • 您实际上是正确的,对外界来说它仍然是一个单一的资源,好点!唯一失败的部分仍然是所有可能的情况都使路由文件超载......谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2018-01-07
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多