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

У меня есть две модели User и Image как полиморфная ассоциация, потому что я хочу, чтобы моя модель изображения использовалась повторно в других моделях.

class User < ApplicationRecord

  has_one :cart
  has_many :images, as: :imageable, dependent: :destroy
  accepts_nested_attributes_for :images

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  before_validation :set_name, on: :create
  validates :name, presence: true

  private

  def set_name
    self.name = "person#{rand(1000)}" if self.name.blank?
  end
end

class Image < ApplicationRecord
  mount_uploader :image, ImageUploader
  belongs_to :imageable, polymorphic: true
end

И я сделал Image полиморфным: true и использую gem carrierwave для создания загрузчика`mount_uploader mount_uploader: изображение, ImageUploader в модели изображения: изображение

class ImageUploader < CarrierWave::Uploader::Base
end
and I permit :image parameters to each model: User and Good,

module Admin
  class UsersController < BaseController

    before_action :set_admin_user, only: [:show, :edit, :update, :destroy]

    def users_list
      @admin_users = User.all.preload(:images).where(admin: true)
    end

    def show
    end

    def edit
    end

    def update
      if @user.images.update(admin_user_params)
        redirect_to admin_users_list_path, notice: 'User was successfully updated'
      else
        flash[:alert] = 'User was not updated'
      end
    end

    def destroy
    end

    private

    def set_admin_user
      @user = User.find(params[:id])
    end

    def admin_user_params
      params.require(:user).permit(:name, :email, images_attributes: [:image])
    end
  end
end

В форме просмотра у меня есть следующий код:

<%= form_for [:admin, @user], html: { multipart: true } do |f| %>
  <%= f.label 'Name', class: 'form-group' %>
  <%= f.text_field :name, class: 'form-control' %>
  <%= f.fields_for :images_attributes do |i| %>
    <%= i.label :image %>
    <%= i.file_field :image %>
  <% end %>
  <%= f.label 'Email', class: 'form-group' %>
  <%= f.text_field :email, class: 'form-control' %>
  <%= f.submit class: 'btn btn-oultline-primary' %>
<% end %>

, но когда я хочу обновить пользователя дляНапример, чтобы загрузить изображение, я получил следующее:

Вот что я получил в ответ

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

1 Ответ

0 голосов
/ 26 августа 2018

Поскольку вы добавляете несколько изображений, измените свою форму на:

<%= i.file_field :image, multiple: true, name: "images_attributes[image][]" %>

И в контроллере:

def edit
  @image = @user.images.build
end

def update
  if @user.images.update(admin_user_params)
    create_user_images
    redirect_to admin_users_list_path, notice: 'User was successfully updated'
  else
    flash[:alert] = 'User was not updated'
  end
end

private

def admin_user_params
  params.require(:user).permit(:name, :email, images_attributes: [:id, :user_id, :image])
end

def create_user_images
  if params[:images_attributes]
    params[:images_attributes]['image'].each do |i|
      @image = @user.images.create!(:image => i)
    end
  end
end

Дайте мне знать, если у вас все еще есть проблемы после правок:)

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