Как обновить таблицу и связанную с ней таблицу соединений в той же форме? - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю веб-сайт для подкаста.Мои таблицы - это «Эпизоды» и «Гости», а также объединенный стол «Эпизоды_Гесты».«Эпизоды» имеют и принадлежат многим «гостям».У меня есть форма, которая обновляет информацию о каждом эпизоде, и я пытаюсь разрешить ей обновлять гостей, связанных с этим эпизодом (данные хранятся в объединенной таблице), но не могу понять это.

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

Это таблица из представления «Редактирование» контроллера эпизода

<%= form_for(@episode) do |f| %>
<table summary="Episode form fields">
  <tr>
    <th> Episode ID </th>
    <td><%= f.text_field(:id) %></td>
  </tr>
  <%= f.fields_for :guests, @episode.guests.each do |g| %>
  <tr>
    <!-- I am trying to add a selector for guests -->
    <th>Guest: </th>
    <td>
          <%= g.text_area :last_name %>
    </td>
  </tr>
  <% end %>
</table>
      <div class="form-buttons">
        <%= f.submit("Update Episode") %>
        <% end %>
</div>

Модель эпизода

class Episode < ApplicationRecord
  has_and_belongs_to_many :guests
  accepts_nested_attributes_for :guests
  scope:sorted, lambda {order("episode_number ASC")}
end

ГостьМодель

class Guest < ApplicationRecord
  has_and_belongs_to_many :episodes

  scope:sorted, lambda {order("id ASC")}
end

Контроллер эпизодов

class EpisodesController < ApplicationController

 def edit
    @episode = Episode.find(params[:id])
    @guests = @episode.guests.all
  end

  def update
    #Find a object using form parameters
    @episode = Episode.find(params[:id])
    @episode_guests = @episode.guests
    #Update the object
    if @episode.update_attributes(episode_params)
    #If the save succeeds, redirect to the show actions
    redirect_to(episode_path(@episode))
  else
    #If the save fails, redisplay the form so user can fix problems
    render('edit')
  end
end

private

def episode_params
  params.require(:episode).permit(:id, :episode_number, :title, :guests, :file_name, :description, :date_released)
end

def guest_params
  params.require(:guest).permit(:id, :guest_id, :first_name, :last_name)
end
end

Гостевой контроллер

class GuestsController < ApplicationController

  def edit
    @guest = Guest.find(params[:id])
  end

  def update
    #Find a object using form parameters
    @guest = Guest.find(params[:id])
    #Update the object
    if @guest.update_attributes(guest_params)
    #If the save succeeds, redirect to the show actions
    redirect_to(guest_path(@guest))
  else
    #If the save fails, redisplay the form so user can fix problems
    render('edit')
  end
end


private

def guest_params
  params.require(:guest).permit(:id, :guest_id, :first_name, :last_name)
end
end

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

1 Ответ

0 голосов
/ 17 апреля 2019

Дайте это часы и попробуйте. http://railscasts.com/episodes/17-habtm-checkboxes-revised?autoplay=true

Это должно решить вашу проблему. Я бы также предложил сделать has_many_through вместо has_and_belongs_to_many, так как он более гибкий. Об этом тоже говорится в видео.

Вы можете структурировать ваши данные следующим образом: Guests имеют множество от Appearances до Episodes и обратное значение от Episodes до Guests.

Это позволило бы вам посмотреть Guest.first.appearances, чтобы увидеть, что Стив появился в 3 эпизодах, или позвонить Episode.third.guests и увидеть, что Стив, Сьюзи и Ахмед были в этом эпизоде.

...