【问题标题】:Rails 3 controller methods for nested resource don't run用于嵌套资源的 Rails 3 控制器方法不运行
【发布时间】:2011-02-15 00:31:14
【问题描述】:

我正在创建嵌套资源 Foo 和 Bar,其中 Foo has_many Bars 和 Bar 属于_to Foo

这是 BarsController 中的新方法:

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

这是 Bar 新视图的代码:

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

当我尝试加载“新栏”页面时,rails 说找不到值 Nil 的 model_name 方法。奇怪的是,这个稍微修改的视图代码可以工作:

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

但是,当我将 logger.debug 语句放入 BarsController 的新方法中时,它永远不会运行。 rake routes 说并且服务器日志确认 BarsController#new 是被调用的操作,但是为什么新操作中的代码不会运行?我在这里遗漏了什么吗?

【问题讨论】:

  • 如果你改用 f.fields_for 会怎样?
  • 您帖子的第二行:应该是 FoosController 而不是 BarsController,不是?
  • 您是否有任何before_filters 可能会阻止到达new 操作?

标签: ruby-on-rails-3


【解决方案1】:

您可以进行一些更改以使其正常工作:

  1. Bars 嵌套在 Foo 中而不是相反,因此您应该在 FoosController 中编写新操作而不是 BarsController,如下所示:

     def new
        @foo = Foo.new
        @bar = @foo.bars.build
     end
    
  2. 在你的 foo 模型中你应该有:

    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

最后,请注意模型中编写的验证!例如,您的表格可能需要某些字段(您在测试期间忘记填写)才能有效!最近发生在我身上!

【讨论】:

  • 我会试试这个,但我希望能够为现有的 Foos 添加 Bars,这需要我在 BarsController 中完成,不是吗?
  • 实际上,如果您的 Foo 模型接受 Bars 的_nested_attributes,那么您将在 Foo#edit 操作中添加新的 bar。我建议观看这两个部分系列:railscasts.com/episodes/196-nested-model-form-part-1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多