2013-12-11 2 views
0

Я делаю небольшое приложение для рельсов, которое требует загрузки изображения в сообщение/объявление, а затем отображение этого изображения.Rails Paperclip - Не удается правильно загрузить изображение

Я использую драгоценный камень 'Paperclip' для обработки изображений. Когда я создаю свой пост/объявление, отображается «missing.jpg» по умолчанию, а не мое изображение.

Объявления Контроллер

class AdsController < ApplicationController 
    before_action :set_ad, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user! 

    # GET /ads 
    # GET /ads.json 
    def index 
    @ads = Ad.all 
    end 

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

    # GET /ads/new 
    def new 
    @ad = Ad.new 
    end 

    # GET /ads/1/edit 
    def edit 
    end 

    # POST /ads 
    # POST /ads.json 
    def create 
    @ad = Ad.new(ad_params) 

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

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

    # DELETE /ads/1 
    # DELETE /ads/1.json 
    def destroy 
    @ad.destroy 
    respond_to do |format| 
     format.html { redirect_to ads_url } 
     format.json { head :no_content } 
    end 
    end 

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

    # Never trust parameters from the scary internet, only allow the white list through. 
    def ad_params 
     params.require(:ad).permit(:title, :url, images_attributes: [:preview]) 
    end 
end 

_form Посмотреть на

<style type="text/css"> 
.header { 
    display: none!important; 
} 
</style> 

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

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

    <div class="field"> 
    <%= f.label :title %><br> 
    <%= f.text_field :title %> 
    </div> 
    <div class="field"> 
    <span>Contact (URL, Mobile, Address)</span><br> 
    <%= f.text_field :url %> 
    </div> 
    <div class="field"> 
    <%= f.label :image %><br> 
    <%= f.file_field :preview %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

объявления Модель

class Ad < ActiveRecord::Base 

    attr_accessible :title, :url, :preview 
    belongs_to :user 
    has_attached_file :preview, :default_url => "missing.jpg" 

    validates :title, length: { maximum: 20 } 
    validates :url, length: { maximum: 20 } 
end 

Ad Index Просмотр

<h1>Listing ads</h1> 




    <% @ads.each do |ad| %> 
    <div class="adspace_grid"> 
     <%= image_tag ad.preview.url %> 
     <div class="text_info"> 
     <span class="bold"><%= ad.title %></span>/
     <span class="bold">Contact : </span><%= ad.url %> 
     </div> 
    </div> 
    <%= link_to 'Delete', ad, :method => :delete %> 
    <% end %> 


<br> 

<%= link_to 'New Ad', new_ad_path %> 

Любая помощь будет принята с благодарностью. Спасибо

EDIT: Это ошибка в Google Chrome Console. Error Code

ответ

1

Проблема заключается в том, где вы разрешаете ad атрибуты:

# Never trust parameters from the scary internet, only allow the white list through. 
def ad_params 
    params.require(:ad).permit(:title, :url, images_attributes: [:preview]) 
end 

Я не знаю, почему у вас есть images_attributes: [:preview] здесь. Определение метода должно быть просто:

def ad_params 
    params.require(:ad).permit(:title, :url, :preview) 
end 

Причина вы не получаете загруженную картинку и получаете по умолчанию missing.jpg происходит потому, что файл, изображение, выбранное в виде не получил создан потому, что вы не разрешая :preview в ваш ad_params способ.

Update:

Что касается пути, то, вы должны быть в состоянии поставить другие параметры Уч, как url и path к has_attached_file. Что-то вроде следующего:

# app/models/ad.rb 

has_attached_file :preview, :default_url => "missing.jpg", 
        :url => "/assets/ads/preview/:id/:style/:basename.:extension", 
        :path => ":rails_root/public/assets/preview/:id/:style/:basename.:extension" 

При этом все ваши загруженные файлы предварительного просмотра будут в public/assets/ads/preview/:id/:style/ каталоге.

+0

Спасибо! Этот параметр определенно был проблемой, но теперь, когда я делаю объявление, изображение не отображается, но когда я проверяю, существует ли изображение, через Google Developer Console я могу перейти к изображению. Так что это определенно есть, но по какой-то причине не отображается. – coreypizzle

+0

Попробуйте установить размер для вашего изображения. Посмотрите здесь: https://github.com/thoughtbot/paperclip – vee

+0

Хм, я только что сделал это, но он, похоже, не имеет никакого эффекта. – coreypizzle

Смежные вопросы