Как я могу добавить связанную запись на странице редактирования ее родителей? - PullRequest
1 голос
/ 16 июля 2011

У меня есть таблица мест и предложений. У каждого места может быть много предложений.

Я бы хотел добавить предложения к объектам со страницы редактирования объектов. Пока что у меня есть это (код ниже), но оно выдает ошибку «NoMethodError in Venues # edit, неопределенный метод` имя_модели для NilClass: Class "».

страница редактирования мест (div id = "tabs-3" - это контейнер в гармошке)

   <div id="tabs-3">
      <%= form_for [@venue, @offer] do |f| %>

        <h2 class="venue_show_orange">Offers</h2>

         <%= f.fields_for :offers do |offer| %>
           <div class="add_offer">
             <%= offer.text_field :title %><br>
           </div>

           <div class="button"><%= submit_tag %></div>
         <% end %>
      <% end %>
    </div>

предлагает контроллер

class OffersController < ApplicationController

  def new
    @offer = Offer.new
  end

  def create
    @offer = @venue.offers.create!(params[:offer])
    @offer.venue = @venue
    if @offer.save
      flash[:notice] = 'Offer added'
      redirect_to offers_path
    else
      render :action => :new
    end
  end

  def edit
    @offer = Offer.find(params[:id])
  end

  def update
    @offer = Offer.find(params[:id])
    @offer.attributes = params[:offer]
    if @offer.save!
      flash[:notice] = 'Offer updated successfully'
      redirect_to offers_path(@offer)
    end
  end
end

диспетчер объектов (здесь ничего не связано - я ошибаюсь?)

class VenuesController < ApplicationController
  protect_from_forgery :only => [:update, :delete, :create] 
  load_and_authorize_resource

  def new
    @venue = Venue.new
    5.times { @venue.venuephotos.build }
  end

  def create
    @venue = Venue.new params[:venue]
    if @venue.save
      flash[:notice] = 'Venue added'
      redirect_to venues_path
    else
      render :action => :new
    end
  end

  def edit
    @venue = Venue.find(params[:id])
    5.times { @venue.venuephotos.build }
  end

  def update
    @venue = Venue.find(params[:id])
    @venue.attributes = params[:venue]
    if @venue.save!
      flash[:notice] = 'Venue updated successfully'
     redirect_to :back
    end
  end
end

Любая помощь очень ценится, спасибо большое!

редактировать

страница редактирования мест

    <div id="tabs-3">
      <%= form_for @venue do |f| %>
        <div class="edit_venue_details">
          <h2 class="venue_show_orange">Offers</h2>

          <%= render :partial => 'offers/offer', :collection => @venue.offers %>

          <div class="clearall"></div>

          <h2 class="edit_venue_sub_header">Add a new offer</h2>
          <%= f.fields_for :offers do |offer| %>
            <% if offer.object.new_record? %>
              <p class="edit_venue">title: <br>
              <%= offer.text_field :title, :class => "edit_venue_input" %></p>
            <% end %>
          <% end %>
        </div>

        <button class="submit_button" type="submit"> Save changes</button>
      <% end %>
    </div>

что отображается

enter image description here

однако, если я добавлю новое предложение, оно будет отображаться правильно:

enter image description here

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Некоторые замечания:

1) Заменить:

<%= form_for [@venue, @offer] do |f| %>

с:

 <%= form_for @venue do |f| %>

Поскольку данные offers будут обновляться через связанный venue, только одно действие контроллера будет обрабатывать форму.

2) Если вы хотите добавить некоторые несуществующие offers в эту форму, вы должны создать их экземпляр, как вы это сделали с venuephotos

3) Покажите свою Venue модель. Вы должны иметь по крайней мере:

accepts_nested_attributes_for :offers
1 голос
/ 25 июля 2011

Исправлено с помощью:

<%= f.fields_for :offers, @venue.offers.build do |offer| %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...