Rails 6 form_with не будет передавать ресурсы с ассоциацией - PullRequest
0 голосов
/ 23 апреля 2020

Я использую Rails 6. У меня есть форма, которую мне нужно передать remote: true, поэтому я получаю POST для обработки как JS:

LOG: MessagesController#create as JS

Вот что Я пытался:

<%= form_for [@hangout, Message.new] do |f| %>

Результат - хорошее сохранение в БД, но обрабатывается как HTML:

LOG: MessagesController#create as HTML

Поэтому я попытался:

<%= form_for [@hangout, Message.new], remote: true do |f| %>

Я узнал, что это приведет к ошибке InvalidAuthenticityToken:

LOG: ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken:

Пробовал это:

<%= form_for [@hangout, Message.new], authenticity_token: true do |f| %>

Он проходит как HTML, а не JS

Я читал, что для Rails 6 лучший способ сделать это был с form_with, потому что он проходит remote:true:

<%= form_with(model: [@hangout, Message.new]) do |f| %>

К сожалению, это никогда не достигает контроллера, поэтому я не получаю ответа. Я знаю, что моя модель и контроллер настроены правильно, так как первая попытка с form_for работает, так что это должно быть так, как я пишу свою form_with, верно?

У кого-нибудь есть какой-нибудь совет?

Спасибо!

#model
class Message < ApplicationRecord
  belongs_to :hangout
  belongs_to :user
end

#controller
class MessagesController < ApplicationController
  before_action :authenticate_user!
  before_action :set_hangout
  def create
    message = @hangout.messages.new(message_params)
    message.user = current_user
    message.save
    redirect_to @hangout
  end
  private
    def set_hangout
      @hangout = Hangout.find(params[:hangout_id])
    end
    def message_params
      params.require(:message).permit(:body)
    end
end

#routes
require 'sidekiq/web'

Rails.application.routes.draw do
  resources :hangouts do
    resource :hangout_users
    resources :messages
  end

  resources :notes

  authenticate :user, lambda { |u| u.admin? } do
    mount Sidekiq::Web => '/sidekiq'
  end

  devise_for :users, controllers: { registrations: 'users/registrations' }

  get 'mine', to: 'notes#mine'

  root to: 'application#root'

  mount Shrine.presign_endpoint(:cache) => '/images/upload'
end

# application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require('stylesheets/application.scss')
require('jquery')
require("packs/notes")
require("packs/hangouts")
window.Jquery = $;
window.$ = $;

ОБНОВЛЕНИЕ

Я добился прогресса, но не совсем там. Я правильно отправляю сообщения в БД с правильной записью, но перенаправления на страницу Hangouts # show нет. Создается. js .erb отображается вместо:

Form: 
<%= form_for [@hangout, Message.new], 
  remote: true, authenticity_token: true, 
  format: :js  do |f| %>

Controller: 
def create    
  @message =  @hangout.messages.build(message_params)
  @message.user = current_user
  respond_to do |format|
        if @message.save
          format.js
          format.html { redirect_to @hangout, notice: 'Success' }
        else
          format.html { render action: 'new' }
   end
  end
 end
LOG: Processing by MessagesController#create as JS

Но теперь создайте. js .erb отображается при видеовстречах # show:

views/messages/create.js.erb
 $("#new_message")[0].reset();

Rendered in the browser:
/hangouts/1/messages.js$("#message_body")[0].reset();

Любая мысль

...