Rails 4.2.x - 在模型中使用参数散列数据
Rails 4.2.x - use params hash data in model
问题 - 有没有办法 pass/use params
将数据散列到关联模型?
我的应用程序的要点:
Image
模型belongs_to
User
模型,User
模型has_many
Image
实例。
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"
在root_url(即StaticPagesController#home
)我有图片上传表格:
我做的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
也是自定义验证:
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
- 众所周知,来自上传表单的所有查询都会转到 params[:image][:uploaded_file]
6.是否可以将 params[:image][:uploaded_file] 作为具有原始哈希结构的哈希传递给 Image
模型?
我尝试过的方法 none 有效:
- 在
Image
模型中传递显式参数散列权 - 不行
- define instance @params_hash = params[:image][:uploaded_file] in
create
action(单独或从自定义 class 方法内部)- NO去
- 在
controller#action
中定义常量 - 不行
什么有效??
全局变量 - $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
问题 - 有没有办法 pass/use params
将数据散列到关联模型?
我的应用程序的要点:
Image
模型belongs_to
User
模型,User
模型has_many
Image
实例。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"
在root_url(即
StaticPagesController#home
)我有图片上传表格:我做的
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
也是自定义验证:
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
- 众所周知,来自上传表单的所有查询都会转到 params[:image][:uploaded_file]
6.是否可以将 params[:image][:uploaded_file] 作为具有原始哈希结构的哈希传递给 Image
模型?
我尝试过的方法 none 有效:
- 在
Image
模型中传递显式参数散列权 - 不行 - define instance @params_hash = params[:image][:uploaded_file] in
create
action(单独或从自定义 class 方法内部)- NO去 - 在
controller#action
中定义常量 - 不行
什么有效??
全局变量 - $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