2015-10-17 1 views
1

У меня есть приложение rails, которое я создал, чтобы я мог использовать часть API. Я могу успешно загрузить файл в DB приложения rails с помощью curl, но я не могу понять, как я могу ограничить тип файла/тип содержимого только CSV.Как добавить подтверждение для refile в приложении rails?

csv_file.rb #model

class CsvFile < ActiveRecord::Base 
    # attachment :content_type => "text/csv" 
    # http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/ 
    attachment :csv, extension: "csv", content_type: "text/csv" 
end 

csv_files.rb #controller

class API::V1::CsvFilesController < ApplicationController 

    # see http://stackoverflow.com/questions/15040964/ for explanation 
    skip_before_filter :verify_authenticity_token 

    def index 
    @csv_files = CsvFile.all 
    if @csv_files 
     render json: @csv_files, 
     # each_serializer: PictureSerializer, 
     root: "csv_files" 
    else 
     @error = Error.new(text: "404 Not found", 
          status: 404, 
          url: request.url, 
          method: request.method) 
     render json: @error.serializer 
    end 
    end 

    def show 
    if @csv_file 
     render json: @csv_file, 
       # serializer: PictureSerializer, 
       root: "csv_file" 
    else 
     @error = Error.new(text: "404 Not found", 
          status: 404, 
          url: request.url, 
          method: request.method) 
     render json: @error.serializer 
    end 
    end 

    # POST /csv_files.json 
    def create 
    @csv_file = CsvFile.new(csv_params) 

    if @csv_file.save 
     render json: @csv_file, 
     # serializer: PictureSerializer, 
     meta: { status: 201, 
      message: "201 Created"}, 
      root: "csv_file" 
    else 
     @error = Error.new(text: "500 Server Error", 
     status: 500, 
     url: request.url, 
     method: request.method) 
     render :json => @error.serializer 
    end 
    end 

    def update 
    end 

    def delete 
    end 

    private 

    def csv_params 

    end 
end 
+0

Вы спрашиваете, должно ли это работать? Или вы попробовали это, и это не сработало? – Elvn

+0

Текущий код реализован и, кажется, не работает, так как я могу загружать файлы, которые не являются CSV. – Chris

+0

Что показывает/говорит вам, что оно не работает? – Elvn

ответ

0

Таким образом, в результате возникли проблемы.

Во-первых, сильные параметры в контроллер должен выглядеть следующим образом,

def csv_params 
    params.permit(:csv_file) 
end 

Во-вторых, мне нужно, чтобы добавить столбец в миграции как таковой,

add_column :csv_files, :csv_file_id, :string 

Наконец, я был может изменить файл модели csv_file.rb и добавить следующую строку.

attachment :csv_file, extension: "csv" 

Как она стоит сейчас, только файлы с расширением .csv могут быть загружены в API.

1

Я не вижу ничего плохого с кодом, так что это может быть ошибка в REFILE. Единственное, что я могу предложить, это работать с использованием пользовательского валидатора.

validate :csv_extension 

private 

def csv_extension 
    unless csv_content_type == "text/csv" 
    errors.add :csv, "format must be csv" # might want to use i18n here. 
    end 
end 

Вы можете использовать расширение файла, а не потому, что content_type не доступны иногда.

def csv_extension 
    unless File.extname(csv_filename) == "csv" 
    errors.add :csv, "format must be csv" 
    end 
end 

Я не стал бы доверять клиенту на этот материал, но даже REFILE зависит от клиента для content_type так это немного по-другому.

+0

Я попытался поместить оба примера в файл модели 'csv_file.rb', но rails все еще дает мне ошибку,' NameError (неопределенная локальная переменная или метод 'csv_filename 'для # ): app/models/csv_file.rb: 16: in 'csv_extension ' app/controller/api/v1/csv_files_controller.rb: 41: in' create' – Chris

+0

Что-то не так с вашим настроить. В этом случае Refile захватит определение вложения, * csv * и добавит к нему * _fulename *. То же самое для размера и content_type. Поэтому я бы дважды проверял, что там происходит. Если ваш код выше правильно, вы не должны получать эту ошибку из Rails. Ps: Вы используете драгоценный камень от мастера? Какую версию ты используешь? – Mohamad

+0

В моих 'Gemfile' для приложения рельсов У меня есть следующие строки, ' камень «REFILE», требуют: «REFILE/Рельсы» камня «REFILE-mini_magick'' бы вы заботитесь обсудить этот вопрос в Рубинский чат, размещенный на chat.stackoverflow.com? – Chris

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

  • Нет связанных вопросов^_^