Rails 4.2.x - 在模型中使用参数散列数据

Rails 4.2.x - use params hash data in model

问题 - 有没有办法 pass/use params 将数据散列到关联模型?

我的应用程序的要点:

  1. Image模型belongs_toUser模型,User模型has_manyImage实例。
  2. Image 架构:

    create_table"images",强制::级联做|t| t.string "filename" t.string "mime_type" t.binary "content" t.integer "user_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false 结束

    add_index"images",["user_id"],姓名:"index_images_on_user_id"

  3. 在root_url(即StaticPagesController#home)我有图片上传表格:

  4. 我做的Image型号:

    def uploaded_file=(initial_data)
      self.filename = initial_data.original_filename
      self.mime_type = initial_data.content_type
      self.content = initial_data.read
      initial_data.rewind
    end
    
  5. 也是自定义验证:

    validate :mime_type
    

def mime_type
    correct_mime = ["image/jpeg", "image/png", "image/gif"]
    unless correct_mime.include? params[:image][:uploaded_file].content_type.chomp
        errors.add(:base, 'must be .jpeg, .png or .gif')
    end
end
  1. 众所周知,来自上传表单的所有查询都会转到 params[:image][:uploaded_file]

6.是否可以将 params[:image][:uploaded_file] 作为具有原始哈希结构的哈希传递给 Image 模型?

我尝试过的方法 none 有效:

什么有效?? 全局变量 - $variable

这是 rails 的方法吗? -> 查询数据到模型

假设你有

def uploaded_file=(initial_data)
  self.filename = initial_data.original_filename
  self.mime_type = initial_data.content_type
  self.content = initial_data.read
  initial_data.rewind
end

因此您将 mime_type 设置为文件的 content_type。

你为什么做不到

def mime_type
  correct_mime = ["image/jpeg", "image/png", "image/gif"]
  unless correct_mime.include? mime_type.chomp
    errors.add(:base, 'must be .jpeg, .png or .gif')
  end
end

模型代码似乎是正确的,这只是您试图将图像数据获取到模型的方式违反约定。通常您会在控制器中创建一个新的 Image 实例,然后设置图像数据,如下所示:

image = user.images.new # If "user" is set to the correct user for the image
image.uploaded_file = params[:image][:uploaded_image]
# ...whatever else you need to do with the image here
image.save

这是一个基本的控制器操作,因此您需要确保 Image 验证并处理验证错误等等,但希望这能让您入门。

在一个好的 MVC 应用程序中,您的模型不应该知道参数、请求或任何直接的用户输入。该模型只是从控制器获取数据并执行业务逻辑并持久保存数据。

class Image < ActiveRecord::Base
  belongs_to :user
  validates_inclusion_of :mime_type,
      in: ["image/jpeg", "image/png", "image/gif"],
      message: 'must be .jpeg, .png or .gif'
end

class ImagesController < ApplicationController

  def new
    @image = Image.new
  end

  def create
    @image = Image.new(
      filename: image_params.original_filename
      mime_type: image_params.content_type,
      content: image_params.read
    )
    if @image.save
      redirect_to root_path
    else
      render :new
    end
  end

  private
    def image_params
      params.require(:image).require(:uploaded_image)
    end
end