路由具有一个关系的嵌套资源?

时间:2013-02-03 00:55:20

标签: ruby-on-rails

每个项目都可以有一个页面:

resources :project do
    resource :page
  end

  class Project < ActiveRecord::Base
    has_one :page
  end

  class Page < ActiveRecord::Base
    belongs_to :project
  end


  def new
    @project = Project.find(params[:project_id])
    @page = @project.build_page
      respond_to do |format|
        format.html
      end
    end

    def create
      @project = Project.find(params[:project_id])
      @page = @project.build_page(params[:page_id])

      respond_to do |format|
        if @page.save
          format.html { redirect_to @page, :notice => 'Page was successfully created.' }
        else
          format.html { render action: "new" }
        end
      end
    end

但是当我去保存页面时,我不仅会收到路由错误,而且实际上并没有保存到数据库。

Routing Error

No route matches [POST] "/projects/2/pages"

我的表单操作如下所示:

<%= form_for([@job, @page]) do |f| %>

有没有人知道发生了什么?我从其他SO帖子中将所有这些拼凑在一起,但是我在这里或那里更换一条线,我觉得我从一个有效的解决方案中得到了进一步的发展。例如,如果我将表单操作更改为:

<%= form_for @page, url: job_page_path(@job) do |f| %>

一切都神奇地起作用,但编辑动作仍然被打破。我屠宰的基本概念是什么?

谢谢! --mark

1 个答案:

答案 0 :(得分:0)

你有一个错字:

 resource :page

应该是

 resources :page

(注意s)

resource(单数)实际上是一种构建不同路由的完全不同的方法。有关详细信息,请参阅the docs

UPDATE / ERRATUM

抱歉,我读得太快了。你应该看一下Ruby on rails: singular resource and form_for - 似乎form_for不知道如何正确处理单一资源。

有人在此建议快速解决此问题:nested form_for singular resource