我学习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(多次)并清除浏览器缓存,这些步骤并没有帮助。
任何人都可以告诉我我失踪了什么吗?非常感谢你。
答案 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