Я использую 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();
Любая мысль