ruby-on-rails - 如何使我的多态模型工作?
问题描述
我有两个模型 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 polymorphic: true 并使用carrierwave gem 创建上传器`mount_uploader mount_uploader :image, ImageUploader in Image model:image
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 %>
但是当我想更新用户例如尝试上传图像时,我得到了下一个:
我无法保存上传我的图片。这是为什么?我希望插入到 db 中,但它没有发生,并且在 db 中我没有附加图像。
解决方案
由于您要添加多个图像,请将您的表单更改为:
<%= 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
如果您在编辑后仍有问题,请告诉我:)
推荐阅读
- google-forms - 谷歌表单地址输入验证
- xamarin.forms - 如何使用 Xamarin.Forms 检测 Android 设备上的传入彩信?
- python - 加载新数据后刷新 QTableView
- python - spyder 启动错误:self.curr_filenames.pop(index) 弹出索引超出范围
- postgresql - 是否可以使用 springboot 应用程序中的脚本和 flyway for postgres 创建数据库?如果是的话怎么办?
- python - 在 Pandas 中合并列和排序
- python - Django 迁移无法删除字段
- powershell - 我需要我的脚本来接受来自文件而不是读取主机的输入
- java - 有没有办法使用scanner().nextLine 方法用数字标记特定名称,如果它们具有相同的名称,则未来的行
- html - 显示内联单选按钮,间距为 div 的全宽