我是一名移植到Ruby on Rails的.NET开发人员。我一直在ASP.NET MVC中编程,现在尝试将相同的概念应用于Rails。我创建了索引操作,现在当我说home / index时,它会自动重定向我不存在的“show”操作。我的routes.rb文件有这个特定的行:
资源:主页
home是home_controller。
我做错了什么?
class HomeController < ApplicationController
def show
end
# show all the articles
def index
@articles = Array.new[Article.new,Article.new,Article.new]
respond_to do |format|
format.html
format.xml { render :xml => @articles }
end
end
def new
@article = Article.new
respond_to do |format|
format.html
format.xml { render :xml => @article }
end
end
def create
@article = Article.new(params[:post]);
if @article.save
format.html { redirect_to(@post,
:notice => 'Post was successfully created.') }
end
end
def confirm
end
end
答案 0 :(得分:3)
你可以运行“rake routes”来查看rails对你的路由的看法,以及将哪些url分配给哪些控制器。
在你的情况下,我得到:
home_index GET /home(.:format) {:action=>"index", :controller=>"home"}
home_index POST /home(.:format) {:action=>"create", :controller=>"home"}
new_home GET /home/new(.:format) {:action=>"new", :controller=>"home"}
edit_home GET /home/:id/edit(.:format) {:action=>"edit", :controller=>"home"}
home GET /home/:id(.:format) {:action=>"show", :controller=>"home"}
home PUT /home/:id(.:format) {:action=>"update", :controller=>"home"}
home DELETE /home/:id(.:format) {:action=>"destroy", :controller=>"home"}
因此,要进入索引操作,您需要转到“/ home”。如果你转到“/ home / index”,它会认为“index”是资源的ID,因此会调度到show动作。
但是,在Rails中,自定义为控制器使用多个名称,并在它们所代表的资源之后命名它们(这通常是模型,但不一定是这样)。因此,在您的情况下,控制器的名称应为“ArticlesController”,您的routes.rb应包含“resources:articles”。 Rails对复数和单数名称非常肛门。
使用您正在访问的资源的复数名称的一大优势是,您现在可以使用简短的符号,例如“redirect_to @article”,“form_for @article do | f |”等。
因此,Rails中的资源应该告诉您实际获得的内容。这也有助于维护,因为其他开发人员不得不猜测。如果您发现自己需要多个ArticlesController,请考虑使用命名空间,或尝试确定其中一个控制器是否实际上是另一个资源(即使它们将数据存储在同一个数据库表中)。
有关路由器的更多信息,请参阅Rails指南:http://guides.rubyonrails.org/routing.html