Обновление нескольких таблиц в одной форме в Rails 2.3.x - PullRequest
1 голос
/ 12 марта 2012

Кажется, должен быть очень быстрый Railsy способ сделать это, но чрезмерный поиск в Google ничего не дал, чтобы прояснить ситуацию.

OK. Мне нужно обновить три таблицы из одной формы. Часть представления уравнения хорошо документирована (form_for, fields_for). Но я не уверен, как обрабатывать параметры формы, которые отправляются в действие обновления в родительском контроллере. Примечание. Все три таблицы имеют определенную ассоциацию Rails.

Вид:

 <% form_for @account do |a| %>

  <table>
    <tr class="odd">
      <td>
        <%= a.label :plan_id %>
      </td>
      <td>
        <%= a.text_field :plan_id %>
      </td>
    </tr>

    <tr class="even">
      <td>
        <%= a.label :company %>
      </td>
      <td>
        <%= a.text_field :company %>
      </td>
    </tr>

    <% fields_for @user do |u| %>

      <tr class="odd">
        <td>
          <%= u.label :first_name %>
        </td>
        <td>
          <%= u.text_field :fname %>
        </td>
      </tr>
      <tr class="even">
        <td>
          <%= u.label :last_name %>
        </td>
        <td>
          <%= u.text_field :lname %>
        </td>
      </tr>
    <tr class="odd">
        <td>
          <%= u.label :email %>
        </td>
        <td>
          <%= u.text_field :email %>
        </td>
      </tr>
      <tr class="even">
        <td>
          <%= u.label :phone %>
        </td>
        <td>
          <%= u.text_field :phone %>
        </td>
      </tr>
      <tr class="odd">
        <td>
          <%= u.label :title %>
        </td>
        <td>
          <%= u.text_field :title %>
        </td>
      </tr>  

    <% end %>

    <% fields_for @site do |s| %>

      <tr class="even">
        <td>
          <%= s.label :domain %>
        </td>
        <td>
          <%= s.text_field :domain_name %>
        </td>
      </tr>
      <tr class="odd">
        <td> 
          <%= s.label :url %>
        </td>
        <td>
          <%= s.text_field :url %>
        </td>
      </tr>

    <% end %>

      <tr>
        <td colspan="2">  
          <%= a.submit :submit %>
        </td>
      </tr>

  </table>

<% end %>

Обновить действие контроллера учетных записей (это не работает):

account = params[:account]
user = account
site = account

account.save!
user.save!
site.save!

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

1 Ответ

0 голосов
/ 23 мая 2012

Если учетные записи / пользователи / сайты все связаны, то ваши ассоциации в вашей модели будут обрабатывать "таблицы" для вас.Вы должны думать о своей проблеме с точки зрения моделей (то есть: ваш домен / бизнес-проблема).Допустим, у одного пользователя может быть несколько учетных записей (в противном случае нет смысла в модели учетных записей), и у каждой учетной записи может быть свой сайт (приложение для управления веб-хостингом?).

Если вы настраиваете ассоциации в приложении / моделях/*.rb с отношениями has_many и т. д. сохранить форму в методе контроллера (или в IRB) довольно просто.Код контроллера, который у вас есть, неверен.Вы не можете назначать переменные подобным образом и ожидать, что Rails сделает так много магии.

account.user = params[:user]
account.site = params[:site]

Для вложенных форм.Если вы не можете заставить это работать, используйте rails c:

account = Account.new
user = User.new
site = Site.new
account.user = user
account.site = site
account.save  # will fail if you have constraints/validations

Получите его для работы в rails c и IRB, а затем посмотрите на свою форму и активность HTTP, используя Firebug или другой инструмент браузера.Поместите это в метод контроллера puts params, и вы увидите, как вложенные формы публикуются.

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