js.erb отображает только код ruby, а не js - PullRequest
0 голосов
/ 05 ноября 2019

Редактировать: я решил проблему самостоятельно - см. Ниже

У меня есть форма, куда я загружаю изображения, используя маршрут add_picture_to_project_path, включенный в мой projects_controller.rb. Этот метод выполняет загрузку файла в модели, а затем возвращает Json на мой контроллер. Как только это будет сделано, я хочу отрендерить файл add_picture_to_project.js.erb, но у меня возникла следующая проблема. Работает только код ruby, javascript вообще не отвечает.

rout.rb

patch '/addLocalPicture', to: 'projects#add_picture_to_project', as: :add_picture_to_project

show.html.haml

= bootstrap_form_tag(url: add_picture_to_project_path,method: :patch, html: { :multipart => true }) do |f|
      .form-group    
        %input{type:'file', multiple: true, name:"picture", id:"fileupload"}
        = hidden_field_tag 'stock_id', "5da481f45d5f4443c644f89f"
        = hidden_field_tag 'project_id', @project._id
        = hidden_field_tag 'company_id', @company._id
        = f.submit("Valider", class: 'simple-btn')

projects_controller.rb

       def add_picture_to_project
       picture_params = {
                stock_id: params[:stock_id],
                project_id: params[:project_id],
                company_id: params[:company_id],
            }
       @picture = Picture.upload_picture(params[:picture], picture_params, bearer_token)

модель: picture.rb

def self.upload_picture tempfile, picture_params, bearer_token
        params = {
                "photoUploadS3" => UploadIO.new(File.open(tempfile.path), MIME::Types.type_for(tempfile.path), File.basename(tempfile.path)), 
                "stock_id" => picture_params[:stock_id], 
                "project_id" => picture_params[:project_id], 
                "company_id" => picture_params[:company_id], 
                "filename" => File.basename(tempfile.path), 
                "size" => File.size(tempfile.path)
            } 

        # Create the HTTP objects
        uri = URI("#{ENV['API_HOST']}/pictures/addLocalPicture")                       
        req = Net::HTTP::Post::Multipart.new uri.path, params

        req.add_field("Authorization", "Bearer #{bearer_token}") #add to Headers
        res = Net::HTTP.start(uri.hostname, uri.port) do |http|
            res = http.request(req)
            response =  eval(encode_utf8(res.body))                  
            return response.to_struct       
        end                                               
    end    

Это рендеринг add_picture_to_project.js.erb, который выполняет только содержимое ruby. Может быть, это из-за имен файлов?

add_picture_to_project.js.erb

console.log("hello");
<%= say "hello #{@picture}" %>

В моем терминале я получаю

Rendering projects/add_picture_to_project.js.erb
 ______________________________________ 
/ "hello #<OpenStruct                  \
| stock_id=\"5da43c644f89f\ |
| ",                                   |
| project_id=\"5da0c75300c |
| a\",                                 |
| company_id=\"5caddb3d127 |
| 3\",                                 |
| filename=\"RackMultipart20191105-536 |
| 84-1um4lsk.jpg\", size=412324,       |
| unique_filename=\"ff3f2720-001a-11ea |
| -8828-01b6885e7183-RackMultipart2019 |
| 1105-53684-1um4lsk.jpg\",            |
| created_at=\"2019-11-05T22:24:13.926 |
| Z\",                                 |
| updated_at=\"2019-11-05T22:24:13.926 |
| Z\", status=1,                       |
| user_id=\"5d9f3817602ef027\" |
| ,                                    |
| projects=[\"5300ca |
\ \"]>"                                /
 -------------------------------------- 

  Rendered projects/add_picture_to_project.js.erb

РЕДАКТИРОВАТЬ (ответ): Моя проблема была в файле picture.js - мой тип данных был установлен на Json, когда он должен быть «скрипт». Это исправило мою проблему. Я оставляю здесь свой вопрос, чтобы люди могли получить больше информации о том, как настроить загрузку файлов по протоколу net http с помощью загрузчика файлов jquery.

    $('#fileupload').fileupload({
        dataType: 'script',
        done: function (e, data) {
            console.log(data);
            $.each(data.result.files, function (index, file) {
                $('<p/>').text(file.name).appendTo(document.body);
            });
        }
    });

Что я должен изменить, чтобы мой javascript был выполнен?

1 Ответ

0 голосов
/ 05 ноября 2019

Вы должны убедиться, что действие вашего контроллера включает в себя блок respond_to, который позволяет приложению знать, как обрабатывать формат запроса:

def add_picture_to_project
  picture_params = {
    stock_id: params[:stock_id],
    project_id: params[:project_id],
    company_id: params[:company_id],
   }
  @picture = Picture.upload_picture(params[:picture], picture_params, bearer_token)

  respond_to do |format|
    format.js
  end
end
...