2011-03-06 127 views
0

我有一个模型“工作”,我添加了一个新的动作“预览”。为了支持这一新的行动,我已经体改的routes.rb如下:Rails路由问题 - “没有路由匹配...”

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

然后在我的工作创建行动我有以下几点:

if @job.save 
    redirect_to preview_job_url 

然而,当我保存的形式,而不是重定向到预览网址,我得到以下路由错误:

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

想不通为什么发生这种情况,因为URL工作正常(HTTP://本地主机:3000 /职位/ ID /预览),如果我运行耙路线正确的路线似乎在那里:

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

任何想法可能会发生什么?好像所有的东西都已经到位,但我是Rails的新手,所以我确信我错过了一些明显的东西。非常感谢。

+0

您是否已验证实际上得到一个GET请求?如果您在浏览器中访问/ jobs/preview/1会发生什么情况? – 2011-03-07 00:00:02

回答

3

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

在你的控制器试试这个:

if @job.save 
    redirect_to preview_job_url(@job) 
+0

当然,非常有意义 - 谢谢! – cman77 2011-03-07 00:15:23

+0

在您原来的问题中,您从rake路线中的代码段不会与您的来自routes.rb的代码段排队。 'preview_jobs =>/jobs/preview(。:format)'是对作业集合的操作,而'preview_job =>/jobs /:id/preview(。:format)'是对作业集合成员的操作。换句话说,假设两个都是在routes.rb中定义的(这很奇怪),'preview_job_url(@job)=>“/ jobs/1234/preview”'和'preview_jobs_url =>“/ jobs”'。合理?使用起来有点棘手。我们都去过那里。我怀疑你有一个额外的“s”在某个地方。 – MDaubs 2011-03-07 00:15:36