【问题标题】:Rails Routing Question - "No route matches..."Rails 路由问题 - “没有路由匹配......”
【发布时间】:2011-03-06 23:58:17
【问题描述】:

我有一个模型“作业”,我正在向其中添加一个新动作“预览”。为了支持这个新动作,我修改了 routes.rb 如下:

resources :jobs do
   member do
      get 'preview'
   end
end

然后在我的工作创建操作中,我得到以下内容:

 if @job.save
    redirect_to preview_job_url

但是,当我保存表单时,我没有重定向到预览 url,而是收到以下路由错误:

Routing Error
No route matches {:action=>"preview", :controller=>"jobs"}

无法弄清楚为什么会发生这种情况,因为 URL 工作正常 (http://localhost:3000/jobs/id/preview),如果我运行 rake 路由,正确的路由似乎就在那里:

preview_jobs GET    /jobs/preview(.:format)            {:action=>"preview", :controller=>"jobs"}

关于可能发生什么的任何想法?似乎所有部件都已到位,但我是 Rails 的新手,所以我确定我遗漏了一些明显的东西。非常感谢。

【问题讨论】:

  • 您是否确认您确实收到了 GET 请求?如果您在浏览器中访问 /jobs/preview/1 会发生什么?

标签: ruby-on-rails routes custom-routes


【解决方案1】:

您将“预览”定义为成员操作。成员操作是指模型的一个实例。当您调用 preview_job_url 时,您需要传递特定的 Job 对象或 Job 的 ID,以便可以创建 URL。这应该是有道理的...如果您不告诉框架您要为哪个 Job 构建 URL,Rails 如何构建引用特定模型的 URL?

在你的控制器中试试这个:

if @job.save
  redirect_to preview_job_url(@job)

【讨论】:

  • 在您最初的问题中,您来自 rake 路由的 sn-p 与您来自 routes.rb 的 sn-p 不一致。 preview_jobs => /jobs/preview(.:format) 是对作业集合的操作,而preview_job => /jobs/:id/preview(.:format) 是对作业集合成员的操作。换句话说,preview_job_url(@job) => "/jobs/1234/preview"preview_jobs_url => "/jobs" 假设两者都在 routes.rb 中定义(这会很奇怪)。有道理?使用起来有点棘手。我们都去过那里。我怀疑你在某个地方有一个额外的“s”。
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多