Rails资源让我很头疼

时间:2010-11-30 20:18:28

标签: ruby-on-rails

我是一名移植到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

1 个答案:

答案 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