0

我有一个 ruby​​ 2.0.0 和 rails 4.0.0 应用程序,它有一个“吉他”和“照片”模型。我已经使用回形针在 Rails3 中上传单个文件,但对在 Rails 4 中上传多个文件是新手。我创建了第二个模型来保存所述照片,并阅读强参数等。当我收到错误时试图向吉他添加 3 张照片。在日志中:“未经许可的参数:photos_attributes”。我已经尝试将 photos_attributes 添加到白名单中,但没有任何乐趣。我在这里拉头发-网络视图中没有错误,但是当我进入控制台并输入“Photo.all”时,我什么也得不到。我究竟做错了什么?我是新手,请温柔点。

吉他.rb

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

照片.rb

class Photo < ActiveRecord::Base
  belongs_to :guitar

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

吉他控制器.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

意见/吉他/_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 %>

数据库/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
4

2 回答 2

1

有一个错字。

:photos_attributes => [:photo]
于 2013-10-15T15:54:58.887 回答
0

用以下代码替换现有代码并尝试运行该应用程序。

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

或者您可以查看以下链接,我在其中创建了一个具有嵌套属性的示例应用程序。

嵌套属性示例

于 2013-10-15T08:02:16.313 回答