簡體   English   中英

多個回形針文件上載的不允許的參數Rails4

[英]Unpermitted parameters on multiple paperclip file uploads Rails4

我有一個ruby 2.0.0和rails 4.0.0應用程序,具有“吉他”和“照片”模型。 我曾使用回形針在Rails3中上載單個文件,但是對於在Rails 4中上載多個文件是陌生的。我創建了第二個模型來保存上述照片,並讀取強參數等。當出現錯誤時,嘗試將3張照片添加到吉他。 在日志中:“不允許的參數:photos_attributes”。 我嘗試將photos_attributes添加到白名單中,這並不令人高興。 我在這里拔頭發-網頁視圖中沒有錯誤,但是當我進入控制台並鍵入'Photo.all'時,我什么也沒得到。 我究竟做錯了什么? 我是新手,請保持溫柔。

吉他

class Guitar < ActiveRecord::Base
  belongs_to :user
  has_many :photos
  accepts_nested_attributes_for :photos
end

photo.rb

class Photo < ActiveRecord::Base
  belongs_to :guitar

  has_attached_file :photo, styles: {                                                                                          
    thumb: '100x100>',                                                          
    square: '200x200#',                                                         
    medium: '300x300>',                                                         
    large: '600x6003'                                                           
  }
end

guitars_controller.rb

class GuitarsController < ApplicationController
  before_action :set_guitar, only: [:show, :edit, :update, :destroy]

  # GET /guitars
  # GET /guitars.json
  def index
    @guitars = Guitar.all
  end

  # GET /guitars/1
  # GET /guitars/1.json
  def show
  end

  # GET /guitars/new
  def new
    @guitar = current_user.guitars.build
    3.times {@guitar.photos.build}
  end

  # GET /guitars/1/edit
  def edit
    3.times {@guitar.photos.build}
  end

  # POST /guitars
  # POST /guitars.json
  def create
    @guitar = current_user.guitars.build(guitar_params)

    respond_to do |format|
      if @guitar.save
    format.html { redirect_to @guitar, notice: 'Guitar was successfully created.' }
    format.json { render action: 'show', status: :created, location: @guitar }
      else
    format.html { render action: 'new' }
    format.json { render json: @guitar.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /guitars/1
  # PATCH/PUT /guitars/1.json
  def update
    respond_to do |format|
      if @guitar.update(guitar_params)
    format.html { redirect_to @guitar, notice: 'Guitar was successfully updated.' }
    format.json { head :no_content }
      else
    format.html { render action: 'edit' }
    format.json { render json: @guitar.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /guitars/1
  # DELETE /guitars/1.json
  def destroy
    @guitar.destroy
    respond_to do |format|
      format.html { redirect_to guitars_url }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_guitar
      @guitar = Guitar.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def guitar_params
      params.require(:guitar).permit(:make, :model, :year, :color, :serial, :price, :condition, :kind, :bodykind, :frets, :oneowner, :user_id, :description, :photos_attributes)
    end
end

views / guitar / _form.html.erb

<%= form_for @guitar, :html => { :multipart => true } do |f| %>
  <% if @guitar.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@guitar.errors.count, "error") %> prohibited this guitar from being saved:</h2>

      <ul>
      <% @guitar.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :make %><br>
    <%= f.text_field :make %>
  </div>
  <div class="field">
    <%= f.label :model %><br>
    <%= f.text_field :model %>
  </div>
  <div class="field">
    <%= f.label :year %><br>
    <%= f.text_field :year %>
  </div>
  <div class="field">
    <%= f.label :color %><br>
    <%= f.text_field :color %>
  </div>
  <div class="field">
    <%= f.label :serial %><br>
    <%= f.text_field :serial %>
  </div>
  <div class="field">
    <%= f.label :price %><br>
    <%= f.text_field :price %>
  </div>
  <div class="field">
    <%= f.label :condition %><br>
    <%= f.number_field :condition %>
  </div>
  <div class="field">
    <%= f.label :kind %><br>
    <%= f.text_field :kind %>
  </div>
  <div class="field">
    <%= f.label :bodykind %><br>
    <%= f.text_field :bodykind %>
  </div>
  <div class="field">
    <%= f.label :frets %><br>
    <%= f.text_field :frets %>
  </div>
  <div class="field">
    <%= f.label :oneowner %><br>
    <%= f.check_box :oneowner %>
  </div>
  <div class="field">
    <%= f.label :extended_description %><br>
    <%= f.text_area :description %>
  </div>

  <%= f.fields_for :photos do |builder| %>
    <%= builder.label :photo, "Image File" %>
    <%= builder.file_field :photo %>
  <% end %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

db / schema.rb

ActiveRecord::Schema.define(version: 20131014195859) do

  create_table "guitars", force: true do |t|
    t.string   "make"
    t.string   "model"
    t.string   "year"
    t.string   "color"
    t.string   "serial"
    t.string   "price"
    t.integer  "condition"
    t.string   "kind"
    t.string   "bodykind"
    t.string   "frets"
    t.boolean  "oneowner"
    t.integer  "user_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "description"
  end

  add_index "guitars", ["user_id"], name: "index_guitars_on_user_id", using: :btree

  create_table "photos", force: true do |t|
    t.integer  "guitar_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "photo_file_name"
    t.string   "photo_content_type"
    t.integer  "photo_file_size"
    t.datetime "photo_updated_at"
  end

  create_table "users", force: true do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "city"
    t.string   "state"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree

end

有一個錯字。

:photos_attributes => [:photo]

將現有代碼替換為以下內容,然后嘗試運行該應用程序。

def guitar_params
  params.require(:guitar).permit(:make, :model, :year, :color, :serial, :price, :condition, :kind, :bodykind, :frets, :oneowner, :user_id, :description, :photos_attributes [:photo])
end

或者,您可以查看以下鏈接,其中我創建了一個帶有嵌套屬性的示例應用程序。

嵌套屬性示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM