Редактировать вложенные в форму

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

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

Какие бы изменения вы ни вносили в два вложенных раскрывающихся списка, нажатие кнопки «Сохранить изменения» создает НОВЫЕ строки в соответствующих таблицах и не изменяет существующие.

В конечном счете, я хочу, чтобы атрибуты можно было редактировать, а затем у меня будет кнопка «Добавить производителя» и «Добавить масштаб» или ссылка для миниатюр, которым нужно несколько списков.

Вот мои поля формы, где я пытался и не смог передать скрытое поле.

Форма

<%= render 'shared/error_messages', object: f.object %>
      <%= f.label :name %>
      <%= f.text_field :name %>
      <%= f.label :material %>
      <%= f.select 'material', options_from_collection_for_select(Miniature.select("DISTINCT material"), :material, 'material', @miniature.material) %>
      <%= f.fields_for :sizes do |size_fields| %>
      <%= size_fields.label :scale_id, "Scale".pluralize %>
      <%= hidden_field "Miniature Scale", @miniature.sizes %>
      <%= size_fields.select :scale_id, options_from_collection_for_select(Scale.all, :id, :name) %>
      <% end %>
       <%= f.fields_for :productions do |production_fields| %>
      <%= production_fields.label :manufacturer_id, "Manufacturer".pluralize %>
      <%= hidden_field "Miniature Manufacturer", @miniature.productions %>
      <%= production_fields.select :manufacturer_id, options_from_collection_for_select(Manufacturer.all, :id, :name, @miniature.manufacturers) %>
      <% end %>
      <%= f.label :release_date %>
      <%= f.date_select :release_date, :start_year => Date.current.year, :end_year => 1970, :include_blank => true %>

Вот контроллер миниатюр, где я почти уверен, что заполнил «обновление защиты» слишком большим / неправильным материалом.

Контроллер миниатюр

class MiniaturesController < ApplicationController
   before_action :signed_in_user, only: [:new, :create, :edit, :update]
   before_action :admin_user,     only: :destroy


  def show
    @miniature = Miniature.find(params[:id])
  end

  def new
    @miniature = Miniature.new 
    @miniature.productions.build
    @miniature.sizes.build
  end

  def create
    @miniature = Miniature.new(miniature_params)
    @production = @miniature.productions.build
    @size = @miniature.sizes.build
    if @miniature.save
      redirect_to @miniature
    else
      render 'new'
    end
  end

  def edit
    @miniature = Miniature.find(params[:id])

  end

  def update
    @miniature = Miniature.find(params[:id])
    @production = @miniature.productions.find(params[:id])
    @size = @miniature.sizes.find(params[:id])
    if @miniature.update_attributes(miniature_params)
       @production = @miniature.productions.update_attributes(:manufacturer_id)
       @size = @miniature.sizes.update_attributes(:scale_id)
      flash[:success] = "Miniature updated"
      redirect_to @miniature
    else
      render 'edit'
    end
  end
  def index
    @miniatures = Miniature.paginate(page: params[:page])
  end

  def destroy
    Miniature.find(params[:id]).destroy
    flash[:success] = "Miniature destroyed."
    redirect_to miniatures_url
  end

private
    def miniature_params
      params.require(:miniature).permit(:name, :release_date, :material, productions_attributes: [:manufacturer_id], sizes_attributes: [:scale_id])
    end

    def admin_user
      redirect_to(root_url) unless current_user.admin?
    end

    def signed_in_user
      unless signed_in?
        store_location
        redirect_to signin_url, notice: "Please sign in."
      end
    end
end

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

Любая помощь или указатели очень ценятся.


person Ossie    schedule 09.10.2013    source источник


Ответы (1)


Благодаря ответу на этот вопрос я решил эту проблему. То, что у меня уже было, было хорошо для СОЗДАНИЯ, но не работало для ОБНОВЛЕНИЙ, потому что я не внес в белый список идентификаторы модели JOIN в «miniature_params», поэтому они не могли получить существующую информацию.

Теперь у меня productions_attributes: [:id, :manufacturer_id] вместо productions_attributes: [:manufacturer_id]

как показано ниже

def miniature_params
  params.require(:miniature).permit(:name, :release_date, :material, productions_attributes: [:id, :manufacturer_id], sizes_attributes: [:id, :scale_id])
end

Я также могу удалить ВСЕ ссылки на вложенные модели из моего метода обновления контроллера миниатюр, поскольку он «просто работает».

 def update
    @miniature = Miniature.find(params[:id])
    if @miniature.update_attributes(miniature_params)
      flash[:success] = "Miniature updated"
      redirect_to @miniature
    else
      render 'edit'
    end
  end

Надеюсь, это пригодится кому-то в будущем.

person Ossie    schedule 09.10.2013