Rails 3: загрузка формы частично в редактируемый вид другой модели / контроллера - PullRequest
2 голосов
/ 03 февраля 2011

У меня есть две отдельные модели / контроллеры. Один называется "Торговцы", другой называется "CompanyLocations". Мне нужно иметь возможность добавить нового продавца и хотя бы одно местоположение в той же форме. С кнопкой, которая позволяет мне добавить больше мест, если это необходимо.

Используя образцы данных, я заполнил первые 5 из 30 торговцев данными о местоположении. Теперь у вас хорошо работает представление «Показать торговца», оно отображает местоположение продавца и компании под ним.

Моя проблема на новых страницах редактирования / редактирования. Кажется, я не могу поместить другое местоположение в базу данных, связанную с идентификатором продавца.

Ошибка, которую я получаю: «неопределенный метод` company_locations 'для nil: NilClass "после того, как я пытаюсь добавить местоположение компании на странице редактирования продавца.

Также я получаю сообщение об ошибке при попытке добавить нового продавца. И кнопка добавления появляется дважды, один раз для нового продавца и один раз для местоположения добавления.

В моих моделях у меня есть merchant.rb

has_many :company_locations, :dependent => :destroy

company_location.rb

belongs_to :merchant

Вот мои файлы: Контроллеры / merchant_controller.rb

  def new
    @merchant = Merchant.new
    @company_location = @merchant.company_locations.new
  end

  def edit
    @merchant = Merchant.find(params[:id])
    @company_location = @merchant.company_locations.new
  end

Контроллеры / company_locations_controller.rb

  def create
    @company_location = @merchant.company_locations.build(params[:company_location])
    if @company_location.save
      redirect_to 'merchants/show', :flash => { :success => "Company Location Added" }
    else
      redirect_to 'merchants/index', :flash => { :error => "Location not saved" }
    end
  end
  def update

  end

просмотры / продавцы / new.html.erb

<h1>New merchant</h1>

<%= render 'form' %>

<%= render 'company_locations/form' %>

<%= link_to 'Cancel', merchants_path %>

вид / продавцов / _form.html

<%= form_for(@merchant) do |f| %>
  <% if @merchant.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@merchant.errors.count, "error") %> prohibited this merchant from being saved:</h2>

      <ul>
      <% @merchant.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :company_name %><br />
    <%= f.text_field :company_name %>
  </div>
  <div class="field">
    <%= f.label :fanpage_url %><br />
    <%= f.text_field :fanpage_url %>
  </div>
  <div class="field">
    <%= f.label :twitter_id %><br />
    <%= f.text_field :twitter_id %>
  </div>
  <div class="field">
    <%= f.label :website_url %><br />
    <%= f.text_field :website_url %>
  </div>
  <div class="field">
    <%= f.label :contact_email %><br />
    <%= f.text_field :contact_email %>
  </div>
  <div class="field">
    <%= f.label :active %><br />
    <%= f.check_box :active %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Вид / company_locations / _form.html.erb

<%= form_for @company_location do |f| %>
    <%= render 'shared/error_messages', :object => f.object  %>
    <div class="field">
    <%= f.label :address1 %><br />
    <%= f.text_field :address1 %>
  </div>
    <div class="field">
    <%= f.label :address2 %><br />
    <%= f.text_field :address2 %>
  </div>
    <div class="field">
    <%= f.label :city %><br />
    <%= f.text_field :city %>
  </div>
    <div class="field">
    <%= f.label :state %><br />
    <%= f.text_field :state %>
  </div>
    <div class="field">
    <%= f.label :zip %><br />
    <%= f.text_field :zip %>
  </div>
    <div class="field">
    <%= f.label :phone %><br />
    <%= f.text_field :phone %>
  </div>
    <div class="field">
    <%= f.label :fax %><br />
    <%= f.text_field :fax %>
  </div>
    <div class="actions">
        <%= f.submit "Add Location" %>
    </div>
<% end %>

1 Ответ

4 голосов
/ 03 февраля 2011

Если я правильно понимаю ваш пример, я думаю, что основная проблема заключается в том, что вы создаете две отдельные формы в своем представлении для двух отдельных моделей. Прелесть Rails (и большинства современных фреймворков) заключается в возможности использовать «вложенные формы». Здесь есть хороший обзор (хотя и немного устаревший):

http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes

И вы можете увидеть отличный Railscast по этой теме здесь:

http://railscasts.com/episodes/196-nested-model-form-part-1

Вообще говоря, вы должны иметь возможность создать одну форму, которая может редактировать Торговца, а также связанные с ним Местоположения Компании за один раз. Это может занять некоторое время, чтобы обернуть голову, но это значительно упростит ваши контроллеры и дальнейшее развитие. Это полезно?

...