Rails form_with (remote: true) ошибки - PullRequest
0 голосов
/ 30 августа 2018

Мне нужна помощь здесь,

Я получаю сообщение об ошибке при попытке обновить модель с помощью ajax из Rails (form_with / remote: true). Я смог нормально работать с XHR-запросами на URL, которые были ресурсами Rails (см. Маршруты ниже), но с пользовательскими URL я получаю сообщение об ошибке.

Контроллер:

def criar
  @user = current_user
  respond_to do |format|
    if @user.update_attributes(user_params)
      format.js {
        flash[:success] = "Success!"
        redirect_to root_path
      }
    else
      format.js 
    end
  end
end

rspec (запрос):

put user_criar_path(user), xhr: true,
 :params => { ... }

вид:

<%= form_with model: @user, url: user_criar_path(@user), method: :put do |f| %>

маршруты:

namespace :any do
  namespace :things do
    put '/criar', to: 'user#criar'         # problem with XHR
    put '/atualizar', to: 'user#atualizar' # problem with XHR
  end
end

resources :anything   # this one works fine with XHR

Как вы можете видеть в test.log, Processing by UserController#criar as не имеет определенного формата (может быть, в этом проблема?).

test.log:

Processing by UserController#criar as 
  Parameters: { ... }

сообщение об ошибке:

Failure/Error:
  respond_to do |format|
    if @user.update_attributes(user_params)
      format.js {
        flash[:success] = "Success!"
        redirect_to root_path
      }
    else
      format.js 
    end

ActionController::UnknownFormat:
ActionController::UnknownFormat

Еще один запрос теста

it "should be redirect to (criar)" do
  put user_criar_path(1), xhr: true
  expect(response).to redirect_to(new_session_path)
  expect(request.flash_hash.alert).to eq "To continue, please, sign in."
end

Сообщение об ошибке

Failure/Error: expect(response).to redirect_to(new_session_path)
  Expected response to be a <3XX: redirect>, but was a <401: Unauthorized>
  Response body: To continue, please, sign in.

Замечания:

  • Я уже пытаюсь изменить URL на маршрутах: put '/criar', to: 'user#criar', constraints: -> (req) { req.xhr? }
  • Как я уже говорил, я делал то же самое (тесты, контроллер) для других ресурсов, используя XHR из form_with, и они работают нормально. Этот с пользовательским URL, который не работал.
  • Рельсы 5.2 и Rspec 3.6
  • Любой вопрос, просто спросите в комментариях

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Причина проблемы

Ну, после некоторого поиска я нахожу ответ.

Проблема, связанная с сообщением ActionController::UnknownFormat, возникла из-за того, что запрос не был четко определен, как мы могли видеть в журнале, который я публикую:

Обработка UserController # criar as

В конце предложения отсутствовал тип / формат (HTML / JS / ... и т. Д.).

Проблема возникла из-за двух факторов:

  1. Использование сгенерированных путей из rails в Rspec и передача ему параметра:

user_criar_path(1) или put user_criar_path(user), xhr: true, params: {...}

  1. Определение собственного маршрута (rout.rb)

get '/user/new', to: 'user#new' # defining my own route

вместо

resources: user, only: [:new] # определяется Rails

Наблюдение : для маршрутов, определенных Rails (ресурсами), передача параметра в генерируемый путь не вызывает ошибку ActionController::UnknownFormat.

Решение

Удаление параметра из сгенерированного пути (как для Rspec, так и для Rails):

put user_criar_path, params: { "user" => { "id" => 1 } }

или

put user_criar_path, xhr: true, :params => { ... }
0 голосов
/ 30 августа 2018

Попробуйте позвонить request.xhr? до блока respond_to, как было предложено здесь

...