路由重定向到错误的路径

时间:2015-10-08 13:07:47

标签: ruby-on-rails

这就是我的路线目前的样子:

routes.rb

给出了

rake routes

在我的主页上,我有一个创建空缺按钮

<%= link_to "plaats", new_employer_vacancy_path(:employer_id)%>

哪个应链接到第一张图片中的行

get '/employers/:employer_id/vacancies/new', to: 'vacancies#new', as: 'new_employer_vacancy'

在vacancies_controller#new中 - 创建我:

def new
  @vacancy = Vacancy.new
  @employervacancy = Employervacancy.new
end

def create
  @vacancy = Vacancy.create(vacancy_params)
  createEmployervacancy
  redirect_to employer_vacancy_path(current_employer, @vacancy)
end

def createEmployervacancy
  @employer = current_employer
  Employervacancy.create(vacancy_id: @vacancy.id, employer_id: @employer.id)
end

但每当我点击按钮时,我都会被重定向到我的vacancies_controller中的其他方法,这完全无关紧要。

Routing error

这怎么可能?我没有清楚地定义,当点击这条路径时,他应该去空位#new?而不是空缺#show_specific_employer_vacancies?

修改

在听完答案之后,我确实与正确的路线联系在一起。 首先,它给了我这个错误。

Error

尝试传递current_employer.id而非@employer之后,我发现以下错误:

ID error

3 个答案:

答案 0 :(得分:1)

对于您的路线,您最好更改为嵌套路线,以便轻松维护路线。

删除这些代码:

get '/employers/:employer_id/vacancies/:id', to:"vacancies#show_specific_employer_vacancies", as: "employer_vacancy"
get '/employers/:employer_id/vacancies/edit/:id' ...
get '/employers/:employer_id/vacancies/index' ...
get '/employers/:employer_id/vacancies/new' ...
path '/employers/:employer_id/vacancies/:id' ...

变成:

resources :employers do
  resources :vacancies
end

尝试使用基本路线,因为您使用标准的简单形式网址。例如:

<%= simple_form_for(@employee, @vacancy) %>

如果使用上面的嵌套路由,simple_form_for将生成url。

最后,在您的链接中,您必须添加@employer_id

<%= link_to "plaats", new_employer_vacancy_path(:employer_id => @employer_id)%>

我希望这可以帮到你

答案 1 :(得分:-1)

您的路由器无法区分employer_vacancynew_emplyer_vacancy路由,因为:id参数接受任何操作。因此,当您将浏览器指向&#34; / employer / 5 / vacancies / new &#34;时,路线将采用您的employer_vacancy路线并指定{{1 } 而不是转到您的{:employer_id => 5, :id => "new"}路线(因为路线是先到先得的)。

要更正此问题,请在第一条路线中添加约束,以确保只有数字(而不是字符串&#34; new&#34;)被new_employer_vacancy路线接受:

employer_vacancy

答案 2 :(得分:-1)

正如Wes Foster所说,rails路由器试图找到第一场比赛。

这意味着给定路径/employers/999/vacancies/new您的路由器会查看路由,当它看到get '/employers/:employer_id/vacancies/:id时,他认为此路由匹配。因此:employer_id999:idnew

我建议在雇主路线的末尾加上:id:

...
get '/employers/:employer_id/vacancies/new'
...
get '/employers/:employer_id/vacancies/:id'

顺便说一句,这比添加约束更好,因为:

  1. 更容易
  2. 它不会污染路线文件
  3. 稍后您可能希望将ID更改为哈希或字母,然后您必须更改约束