2011-02-15 99 views
1

我创建嵌套资源Foo和Bar其中foo的has_many酒吧和酒吧belongs_to的富Rails 3中嵌套的资源控制方法不跑

这是BarsController新方法:

def new 
    @foo = Foo.find(params[:foo_id]) 
    @bar = @foo.bars.build 
end 

这是酒吧新视图代码:

<%= form_for([@foo, @bar]) do |f| %> 
    <%= f.text_field :name %> 
    <%= f.submit "Save" %> 
<% end %> 

当我尝试加载“新开的酒吧”页面,导轨说,MODEL_NAME方法不能用于值无发现。奇怪的是,这个稍微修改视图代码的工作:

<%= form_for([@foo, @foo.bars.build]) do |f| %> 
    <%= f.text_field :name %> 
    <%= f.submit "Save" %> 
<% end %> 

然而,当我把logger.debug声明BarsController新的方法中,它从来没有运行。耙路径表示并且服务器日志证实BarsController#new是被调用的操作,但为什么新操作中的代码不运行?我在这里错过了什么吗?

+0

如果您尝试使用f.fields_for,该怎么办? – 2011-02-15 00:48:35

+0

你的帖子的第二行:应该是FoosController不是BarsController,不是? – 2011-02-15 00:54:03

回答

1

你可以把作出一些改变它的工作:

  1. 酒吧嵌套在美孚的不是相反,所以不是BarsController你应该写你的新动作你FoosController里面如下:

    def new 
        @foo = Foo.new 
        @bar = @foo.bars.build 
    end 
    
  2. 内,您的富模型,你应该有:

    accepts_nested_attributes_for :bars

  3. 您的看法:

    <%= form_for @foo do |f| %> 
        <%= f.fields_for :bars do |ff| %> 
        <%= ff.text_field :name %> 
        <%= f.submit %> 
    <% end %> 
    
  4. 不要忘记你的FoosController内创建行动:

FoosController

def create  
     @foo = Foo.new(params[:foo]) 
     if @foo.save 
      redirect_to @foo 
     else 
      render :new 
     end 
    end 

最后,要注意写的验证在你的模特里!例如,您的表单有可能需要某些字段(您在测试期间忘记填写的字段)!最近发生在我身上!