帮助申请
如何从不相关的控制器上传图像附件+强参数要求?
背景
我有一个控制器,
Cars
。我有两个模型Car
和Garage
。
Cars
控制器根据用户的车辆创建Garage
对象 属性(users are from devise
)。没有Garages
控制器,因为Cars
控制器创建一个新的@garage
对象。
Garage
模型是Car
模型和其他模型的属性 来自Cars
控制器的值将被存储。
Cars
显示页面列出了所有值请知道此应用程序正常运行,因为除了之外 我希望用户将其车辆的照片(
paperclip gem
)上传到garages
数据库的部分。此应用程序_supposed_functions的方式是......
- cars / 1 此展示页面包含所有车辆属性的列表以及一个按钮,
Browse...
和Add to Garage
按钮。- 选择
可以实现这一点Browse...
按钮可以附加车辆的照片。使用paperclip
gem。- 附上照片后,您可以选择
Add to Garage
按钮。- 醇>
Cars
控制器创建一个Garage
对象,其中包含多个车辆属性,包括一些devise
方法,实例变量 并将这些值放入garages
表。返回 NO 错误。所有值都输入到 附加图像的<{1}} db 除了。
以下是文件
汽车/ cars_controller.rb
garages
模型
models / car.rb (不确定此模型中是否需要has_attached_file但是仍然添加)
class CarsController < ApplicationController
before_action :set_car
def show
@garage = Garage.find(params[:id])
end
def create
@garage = Garage.create( tech_id: @car.service.tech.id, :customer_id: current_customer.id )
if @garage.save
redirect_to techs_path, notice: "You car has been added to the garage!"
elsif
redirect_to tech_path, notice: "Uh oh, flat tire!"
end
end
private
def set_car
@car = Car.find(params[:id])
end
def garage_params
params.permit(:tech_id, :customer_id )
end
end
模型/ garage.rb
class Car < ActiveRecord::Base
belongs_to :service
belongs_to :tech #added 5/27
has_attached_file :garage_photo, styles: { medium: "300x300>", :thumb => "100x100>" }#, :default_url => "/images/:style/missing.png"
validates_attachment_content_type :garage_photo, content_type: /\Aimage\/.*\Z/
end
视图
汽车/ show.html.erb
class Garage < ActiveRecord::Base
belongs_to :customer
belongs_to :tech
has_attached_file :garage_photo, styles: { medium: "300x300>", :thumb => "100x100>" }#, :default_url => "/images/:style/missing.png"
validates_attachment_content_type :garage_photo, content_type: /\Aimage\/.*\Z/
end
路线
<h2>Please review to add to garage </h2>
<b>Your garage tech:</b> <%= @car.service.tech.id %><br>
<b>ID:</b> <%= current_customer.id %><br>
<%= form_for @garage, :html => { :multipart => true } do |f| %>
<%= f.file_field :garage_photo %>
<% end %>
<%= button_to 'Add to Garage', tech_cars_path(tech_id: @car.service.tech.id, id: @car.id) %>
<%= link_to 'Back to tech', tech_path(@car.service.tech.id) %>
6-12添加更多详情
_add_attachment_garage_photo_to_garages.rb 迁移文件
Rails.application.routes.draw do
devise_for :customers, controllers: { sessions: 'customers/sessions' }, :path => ''
devise_for :techs, controllers: { sessions: 'techs/sessions' }
#, :path => ''#, :path_names => { :sign_in => "login", :sign_out => "logout" }
resources :techs, only: [:index, :show], shallow: true do
resources :cars, only: [:show, :create]
end
resources :service_menus, :services, :garages
root to: "home#index"
end
的MySQL&GT;描述车库 代码段
class AddAttachmentGaragePhotoToGarages < ActiveRecord::Migration
def change
change_table :garages do |t|
t.attachment :garage_photo
end
end
end
| |
请就以下问题提出建议:
如何从不相关的| garage_photo_updated_at | datetime | YES | | NULL | |
| garage_photo_file_size | int(11) | YES | | NULL | |
| garage_photo_content_type | varchar(255) | YES | | NULL | |
| garage_photo_file_name | varchar(255) | YES | | NULL
控制器上传图像附件到garages
db?除了Cars
之外,所有内容都会添加到garages
db。请注意,选择image attachment
按钮时不会返回任何错误。这是一个强烈的params问题吗?
Add to Garage
控制器中是否需要强制参数?如果是,我如何将db Cars
分配给实例:keys
?我已经搜索了所有内容,但不清楚如何将实例变量分配给强对数的密钥。
@variables
@garage = Garage.create(garage_params)
如果可能,请提供您可能采用的任何重构方法。
任何帮助将不胜感激。 如果您需要更多详细信息,请与我们联系。
由于
答案 0 :(得分:0)
您需要在强参数
中加入garage_photo
汽车/ cars_controller.rb
class CarsController < ApplicationController
before_action :set_car
def show
@garage = Garage.find(params[:id])
end
def create
@garage = Garage.create(garage_params)
if @garage.save
redirect_to techs_path, notice: "You car has been added to the garage!"
elsif
redirect_to tech_path, notice: "Uh oh, flat tire!"
end
end
private
def set_car
@car = Car.find(params[:id])
end
def garage_params
params.permit(:tech_id, :customer_id, :garage_photo )
end
end
汽车/ show.html.erb
<h2>Please review to add to garage </h2>
<b>Your garage tech:</b> <%= @car.service.tech.id %><br>
<b>ID:</b> <%= current_customer.id %><br>
<%= form_for @garage, :html => { :multipart => true } do |f| %>
<%= f.hidden_field :tech_id, value: @car.service.tech.id %>
<%= f.hidden_field :customer_id, value: current_customer.id %>
<%= f.file_field :garage_photo %>
<% end %>
<%= button_to 'Add to Garage', tech_cars_path(tech_id: @car.service.tech.id, id: @car.id) %>
<%= link_to 'Back to tech', tech_path(@car.service.tech.id) %>
答案 1 :(得分:0)
我因为没有及早看到它而打我自己。对于具有文件上载字段的同一表单,您的视图没有提交按钮! &lt;%= button_to%&gt;创建一个完全独立的表单,基本上将整个表单封装到一个按钮中。因此,单击此按钮时,您在上述表单中提供的任何值都不会被提交。相反,你应该创建一个标准&lt;%= f.submit“Submit”%&gt;键入按钮。