Rails:如何从不相关的控制器上传Paperclip图像附件到数据库+强参数要求

时间:2015-06-12 05:02:26

标签: ruby-on-rails ruby devise paperclip strong-parameters

帮助申请

如何从不相关的控制器上传图像附件+强参数要求?

背景

  

我有一个控制器,Cars。我有两个模型CarGarage

     

Cars控制器根据用户的车辆创建Garage对象   属性(users are from devise)。没有Garages   控制器,因为Cars控制器创建一个新的@garage对象。

     

Garage模型是Car模型和其他模型的属性   来自Cars控制器的值将被存储。

     

Cars显示页面列出了所有值

     

请知道此应用程序正常运行,因为除了之外   我希望用户将其车辆的照片(paperclip gem)上传到garages数据库的部分。

     

此应用程序_supposed_functions的方式是......

     
      
  1. cars / 1 此展示页面包含所有车辆属性的列表以及一个按钮,Browse...Add to Garage按钮。
  2.   
  3. 选择Browse...按钮可以附加车辆的照片。使用paperclip gem。
  4. 可以实现这一点   
  5. 附上照片后,您可以选择Add to Garage按钮。
  6.   
  7. Cars控制器创建一个Garage对象,其中包含多个车辆属性,包括一些devise方法,实例变量   并将这些值放入garages表。
  8.         

    返回 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

| |

请就以下问题提出建议:

  1. 如何从不相关的| 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问题吗?

  2. Add to Garage控制器中是否需要强制参数?如果是,我如何将db Cars分配给实例:keys?我已经搜索了所有内容,但不清楚如何将实例变量分配给强对数的密钥。

    @variables
    @garage = Garage.create(garage_params)

  3. 如果可能,请提供您可能采用的任何重构方法。

  4. 任何帮助将不胜感激。 如果您需要更多详细信息,请与我们联系。

    由于

2 个答案:

答案 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;键入按钮。