2013-01-09 71 views
1

我想要获得更好的Rail的嵌套资源句柄,并且使用模型School作了测试应用。在我routes.rb文件,我有:使用Rails 3的嵌套资源来正确关联模型

resources :schools do 
    resources :classes 
end 

随着学校级以下车型的关系:

class School < ActiveRecord::Base 
    attr_accessible: name 
    has_many :classes 
end 

class Class < ActiveRecord::Base 
    attr_accessible: name, school_id 
    belongs_to :school 
end 

我有困难得到school_id与在像0这样的URL下创建的帖子相关联。更确切地说,我想定义一个像current_school这样的帮助器方法,它可以将URI的前半部分包含school_id,以允许我在控制器中编写函数,如current_school.posts.all,该函数将自动提取与school_id =网址中有什么。谢谢!

* 编辑

这是我在ClassController

class ClassesController < ApplicationController 

    def index 
    @classes = current_school.classes.all 
    end 

    def new 
    @class = current_school.classes.build 
    end 

    def create 
    @class = current_school.classes.build(params[:post]) 
    if @class.save 
     redirect_to root_path #this will be further modified once I figure out what to do 
    else 
     redirect_to 'new' 
    end 
    end 

    private 

    def current_school 
    @current_school ||= School.find(params[:school_id]) 
    end 

end 

而在new.html.erb文件:

<div class="span6 offset3"> 
    <%= form_for([@school, @class]) do |f| %> 

     <%= f.label :name, "class title" %> 
     <%= f.text_field :name %> 

     <%= f.submit "Create class", class: "btn btn-large btn-primary" %> 
    <% end %> 
    </div> 

回答

1

当你窝你的资源,你会得到一些帮助免费方法如解释here。您正在寻找的方法将被写成之一:

new_school_class_path(@school) 
new_school_class_path(@school_id) 

虽然你的类索引页将是:

school_classes_path(@school) 
school_classes_path(@school_id) 

在你ClassesController,你会做这样的事情:

def index 
    @classes = current_school.classes 
end 

def new 
    @class = current_school.classes.build 
end 

private 
def current_school 
    @current_school ||= School.find(params[:school_id]) 
end 
+0

谢谢!我添加了代码,现在'index'和'new'函数正常工作。但是,使用我的“创建”功能,我得到一个错误“找不到没有ID的学校”。我已经发布了'create'函数以及'new.html.erb'中出现的'form_for'助手在上面的问题正文中,并且不知道是什么可能导致此问题。再次感谢你的帮助! – daspianist

+1

@daspianist:在你的new.html.erb表单中:'<%= form_for([@ school,@class])do | f | %>'应该读取<%= form_for([@ current_school,@class])do | f | %>' – PinnyM

+0

谢谢 - 非常棒!感谢您帮助我更好地理解这一点。 – daspianist