我尝试将我的rails应用程序升级到4.0.1,我的控制器中出现了一行@ gallery.pictures.build:
NameError in GalleriesController#new
uninitialized constant Gallery::Picture
@gallery = Gallery.new
@gallery.token = @gallery.generate_token
@picture = @gallery.pictures.build
@pictures = []
除了使用强参数之外,我没有更改任何代码,也无法找出代码破坏的原因。任何帮助将非常感谢!
如果有助于查找错误,可以使用以下代码:
class GalleriesController < ApplicationController
# GET /galleries
# GET /galleries.json
def index
@galleries = Gallery.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @galleries }
end
end
# GET /galleries/1
# GET /galleries/1.json
def show
@gallery = Gallery.find(params[:id])
@picture = @gallery.pictures.build
@pictures = Picture.find(:all, :conditions => [ 'gallery_id = ?', @gallery.id ])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @gallery }
end
end
# GET /galleries/new
# GET /galleries/new.json
def new
@gallery = Gallery.new
@gallery.token = @gallery.generate_token
@picture = @gallery.pictures.build
@pictures = []
respond_to do |format|
format.html # new.html.erb
format.json { render json: @gallery }
end
end
# GET /galleries/1/edit
def edit
@gallery = Gallery.find(params[:id])
@picture = @gallery.pictures.build
@pictures = []
end
# POST /galleries
# POST /galleries.json
def create
@gallery = Gallery.new(gallery_params)
@pictures = Picture.where(:gallery_token => @gallery.token)
@gallery.pictures << @pictures
respond_to do |format|
if @gallery.save
format.html { redirect_to @gallery, notice: 'Gallery was successfully created.' }
format.json { render json: @gallery, status: :created, location: @gallery }
else
format.html { render action: "new" }
format.json { render json: @gallery.errors, status: :unprocessable_entity }
end
end
end
# PUT /galleries/1
# PUT /galleries/1.json
def update
@gallery = Gallery.find(params[:id])
respond_to do |format|
if @gallery.update_attributes(gallery_params)
format.html { redirect_to @gallery, notice: 'Gallery was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @gallery.errors, status: :unprocessable_entity }
end
end
end
# DELETE /galleries/1
# DELETE /galleries/1.json
def destroy
@gallery = Gallery.find(params[:id])
@gallery.destroy
respond_to do |format|
format.html { redirect_to galleries_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_gallery
@project = @label.projects.find(params[:id])
end
# Use this method to whitelist the permissible parameters. Example:
# params.require(:person).permit(:name, :age)
#
# Also, you can specialize this method with per-user checking of permissible
# attributes.
def gallery_params
params.require(:gallery).permit(:cover, :description, :name, :token)
end
end
类PicturesController&lt; ApplicationController中
before_action :set_picture, only: [:show, :edit, :update, :destroy]
# GET /pictures
# GET /pictures.json
def index
@gallery = Gallery.find(params[:gallery_id])
@pictures = @gallery.pictures
respond_to do |format|
format.html # index.html.erb
format.json { render json: @pictures }
end
end
# GET /pictures/1
# GET /pictures/1.json
def show
@picture = Picture.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @picture }
end
end
# GET /pictures/new
# GET /pictures/new.json
def new
@gallery = Gallery.find(params[:gallery_id])
@picture = @gallery.pictures.build
respond_to do |format|
format.html # new.html.erb
format.json { render json: @picture }
end
end
# GET /pictures/1/edit
def edit
@gallery = Gallery.find(params[:gallery_id])
@picture = @gallery.pictures.find(params[:id])
# @picture = Picture.find(params[:id])
end
# POST /pictures
# POST /pictures.json
def create
p_attr = params[:picture]
Rails.logger.debug("[debug] : #{p_attr}" );
p_attr[:image] = params[:picture][:image].first if params[:picture][:image].class == Array
Rails.logger.debug("[debug] : #{p_attr[:image]}" );
if params[:gallery_id]
@gallery = Gallery.find(params[:gallery_id])
@picture = @gallery.pictures.build(p_attr)
else
@picture = Picture.new(p_attr)
end
if @picture.save
respond_to do |format|
format.html {
render :json => [@picture.to_jq_upload].to_json,
:content_type => 'text/html',
:layout => false
}
format.json {
render :json => [@picture.to_jq_upload].to_json
}
end
else
render :json => [{:error => "custom_failure"}], :status => 304
end
end
# PUT /pictures/1
# PUT /pictures/1.json
def update
@gallery = Gallery.find(params[:gallery_id])
@picture = @gallery.pictures.find(params[:id])
respond_to do |format|
if @picture.update_attributes(picture_params)
format.html { redirect_to gallery_path(@gallery), notice: 'Picture was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @picture.errors, status: :unprocessable_entity }
end
end
end
# DELETE /pictures/1
# DELETE /pictures/1.json
def destroy
@gallery = Gallery.find(params[:gallery_id])
@picture = @gallery.pictures.find(params[:id])
@picture.destroy
respond_to do |format|
format.html { redirect_to gallery_pictures_url }
format.js
end
end
def make_default
@picture = Picture.find(params[:id])
@gallery = Gallery.find(params[:gallery_id])
@gallery.cover = @picture.id
@gallery.save
respond_to do |format|
format.js
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_picture
@project = @label.projects.find(params[:id])
end
# Use this method to whitelist the permissible parameters. Example:
# params.require(:person).permit(:name, :age)
#
# Also, you can specialize this method with per-user checking of permissible
# attributes.
def picture_params
params.require(:picture).permit(:description, :gallery_id, :image, :crop_x, :crop_y, :crop_w, :crop_h, :gallery_token)
end
end
class Gallery&lt;的ActiveRecord ::基
has_many :pictures, :dependent => :destroy
def generate_token
self.token = loop do
random_token = SecureRandom.urlsafe_base64
break random_token unless Gallery.where(token: random_token).exists?
end
end
end
class Picture&lt;的ActiveRecord :: Base的 attr_accessor:crop_x,:crop_y,:crop_w,:crop_h
belongs_to :gallery
mount_uploader :image, ImageUploader
after_update :crop_image
def to_jq_upload
{
"name" => read_attribute(:image),
"size" => image.size,
"url" => image.url,
"thumbnail_url" => image.thumb.url,
"delete_url" => id,
"picture_id" => id,
"delete_type" => "DELETE"
}
end
def crop_image
image.recreate_versions! if crop_x.present?
current_version = self.image.current_path
large_version = "#{Rails.root}/public" + self.image.versions[:large].to_s
FileUtils.rm(current_version)
FileUtils.cp(large_version, current_version)
end
end