Rails Routing错误地链接到show.html

时间:2015-05-29 18:13:46

标签: ruby-on-rails

我学习Rails并遇到了一些我不理解的行为。我试图创建一个简单的CRUD应用程序。在'新'在数据输入字段和提交按钮后查看我正在尝试添加将转到另一个页面的链接(我将其称为“fnord'”)。

而不是链接到fnord,它会转到show.html。鉴于rails是基于约定的,我想知道这是否是某种类型的默认行为,但我还没有能够弄清楚是什么触发它或正确的路由到fnord。

这是Rails 3.2.21,Ruby 1.9.3。我最初使用脚手架生成模型,视图和控制器,然后开始调整事物。

这是我的控制器(减去不相关的行为 - 索引,销毁等):

class EmployeesController < ApplicationController 
  def show
    @employee = Employee.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @employee }
    end
  end

  def new
    @employee = Employee.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @employee }
    end
  end

  def fnord
    #nothing yet - just trying to get the page to appear right now
  end

这是来自new.html.erb的相关代码:

<h2>New Employee</h2>
<%= render 'form' %>

<!-- content, data entry fields, submit button, etc -->

<div>
  <%= link_to 'Fnord', employees_fnord_path %>
<div/>

这是视图,fnord.hmtl.erb:

<h2>Fnord</h2>
<br/>
<p>this is fnord.html</p>

这是我的routes.rb:

MyApp::Application.routes.draw do
  resources :employees  
  get 'employees/fnord'
  root :to => 'employees#new'  
end

我跑了耙路线&#39;并获得以下输出:

       employees GET    /employees(.:format)          employees#index
                 POST   /employees(.:format)          employees#create
    new_employee GET    /employees/new(.:format)      employees#new
   edit_employee GET    /employees/:id/edit(.:format) employees#edit
        employee GET    /employees/:id(.:format)      employees#show
                 PUT    /employees/:id(.:format)      employees#update
                 DELETE /employees/:id(.:format)      employees#destroy
 employees_fnord GET    /employees/fnord(.:format)    employees#fnord
            root        /                             employees#new

据我所知,这一切看起来都是正确的,但是当我点击new.html中的链接时,它会返回show.html,而不是fnord.html。

浏览器中显示的网址甚至是locahost:3000 / employees / fnord,但内容来自show.html。

我阅读了路由文档(http://guides.rubyonrails.org/routing.html),但没有看到任何解释。

我已尝试重启rails(多次)并清除浏览器缓存,这些步骤并没有帮助。

任何人都可以告诉我我失踪了什么吗?非常感谢你。

1 个答案:

答案 0 :(得分:0)

/employees/fnord的路由与show路由匹配,因为展示路线正在寻找以下格式的网址:/employees/:id

当您转到/employees/fnord时,它会将fnord解释为某个员工的ID,并将其路由到show方法。

修复它的一种方法是在资源路由之前声明/employees/fnord路由,以便它首先匹配:

MyApp::Application.routes.draw do
  get 'employees/fnord'
  resources :employees  
  root :to => 'employees#new'  
end

另一种方法是简单地更改URL的名称,使其与/employees/:id的模式不匹配:

MyApp::Application.routes.draw do
  resources :employees  
  get 'employees1/fnord', to: 'employees#fnord'
  # or whatever
  get 'foo', to: 'employees#fnord'
  # etc...
  get 'employees/foo/fnord', to: 'employees#fnord'
  root :to => 'employees#new'  
end