Передать параметр в контроллер Rails, используя AJAX - PullRequest
0 голосов
/ 22 января 2020

Я хочу отправить запрос поста из моего JavaScript кода в мое действие show в Ruby на Rails, которое содержит данные, которые я хочу сохранить в переменной экземпляра, чтобы я мог сохранить их в форме в моем просмотреть и загрузить его на мой сервер.

Как вы можете видеть ниже, параметр 'base64' отображается в моих журналах rails, но когда я пытаюсь вызвать @ base64 в моем представлении, после получения значения в контроллер, это ноль.

Любой совет приветствуется, спасибо!

Просмотр

var full_base64 =  "data:image/jpeg;base64," + base64;

                $.ajax({
                    data: 'base64=' + full_base64,
                    type: 'POST',
                    url: "/videos/show/<%=@video.id%>"
                });

Контроллер

    def show
        @video = Video.find(params[:id])
        if params[:base64].present?
            @base64 = params[:base64]
        end
    end

Маршруты

post 'videos/show/:id', to: 'videos#show'

Журнал сервера Rails:

Started POST "/videos/show/1" for 127.0.0.1 at 2020-01-22 12:59:40 -0600
Processing by VideosController#show as */*
Parameters: {"base64"=>"data:image/jpeg;base64,iV...
...
, "id"=>"1"}

Консоль

>> 

@base64
=> nil
>> 

Ответы [ 3 ]

1 голос
/ 23 января 2020

Только к вашему сведению - я также заметил странные вещи в Rails, если вы явно не определяете тип контента. В опубликованном вами примере вы не указали contentType, и по этой причине он может быть разбор ноль. При публикации данных base 64 вы можете указать тип контента:

               $.ajax({
                    data: 'base64=' + full_base64,
                    type: 'POST',
                    contentType: 'application/octet-stream'
                    url: "/videos/show/<%=@video.id%>"
                });

, и это может изменить то, что контроллер анализирует для тела.

Как разместить изображение в кодировке base64 через. ajax?

1 голос
/ 23 января 2020

Просто используйте строка вместо символ для га sh ключ

if params["base64"].present?
  @base64 = params["base64"]
end
1 голос
/ 23 января 2020

Если я правильно понимаю, вы пытаетесь передать AJAX в действие show в вашем контроллере. Это очень ОБОБЩЕННЫЙ ответ, поскольку вы не включили ни один из своих кодов HTML, и похоже, что у вас нет кнопки для запуска AJAX. Но я постараюсь указать вам правильное направление. Вам нужно сделать что-то в общих чертах:

var full_base64 =  "data:image/jpeg;base64," + base64;

            $.ajax({
                data: 'base64=' + full_base64,      
                type: 'POST',
                url: "/videos/my_ajax_upload"
            });

Это отправит ваш AJAX вызов в метод контроллера, который я назвал my_ajax_upload, но вы можете вызывать его как угодно. В вашем контроллере вам понадобится что-то вроде:

def my_ajax_upload
  @video.update(base_64: params[:base64])
  respond_to do |format|
    format.js {render :action => "base_64_response" }
  end
end 

Это отвечает на начальный вызов AJAX, сохраняя параметр, отправленный вами в БД, и отвечая, вызывая файл с именем base_64_response.js.erb, который может выглядеть как-то например:

$('#pic_upload').html('<%= escape_javascript(render :partial => 'base_64_response') %>');

, который будет отображать файл HTML с именем base_64_response.html.erb, который должен содержать код html, который вы хотите отобразить на странице, которая его назвала.

<div id="pic_upload">
  <%= @base64 =>
</div>

Цикл равен load page -> do something to trigger AJAX call to controller method -> process AJAX call with controller method -> render JS file -> JS file replaces div in page with new html

Возможно, вам нужно больше узнать о том, как AJAX работает в Rails. Этот RailsCast может помочь http://railscasts.com/episodes/136-jquery-ajax-revised?view=asciicast

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...