Методы контроллера Rails 3 для вложенного ресурса не запускаются - PullRequest
1 голос
/ 15 февраля 2011

Я создаю вложенные ресурсы 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 говорит, что метод model_name не может быть найден для значения Nil.Любопытно, что этот слегка модифицированный код представления работает:

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

Однако, когда я помещаю инструкцию logger.debug в новый метод в BarsController, он никогда не запускается.Rake Routers говорит, и журнал сервера подтверждает, что BarsController # new вызывается действие, но почему не запускается код, который находится внутри нового действия?Я что-то здесь упускаю?

1 Ответ

1 голос
/ 15 февраля 2011

Некоторые изменения, которые вы можете внести, чтобы заставить его работать:

  1. Бары вложены в Foo, а не наоборот, поэтому вместо BarsController вы должны написать новое действие в вашем FoosController следующим образом:

     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

Наконец, обратите внимание на проверки, написанные в ваших моделях!Например, возможно, что некоторые поля (которые вы забыли заполнить во время тестов) необходимы для того, чтобы ваша форма была действительной!Случилось со мной недавно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...