в моем приложении блога rails я получаю это сообщение об ошибке при попытке отправить форму для нового сообщения:
ActionController :: InvalidAuthenticityToken в PostsController # create ActionController :: InvalidAuthenticityToken Извлеченный источник (около строки № 211):
def handle_unverified_request
raise ActionController::InvalidAuthenticityToken
end
end
end
это мой файл posts_controller.rb:
class PostsController < ApplicationController
def index
end
def new
end
def create
@post=Post.new(post_params)
@post.save
redirect_to @post
end
def show
@show=Post.find(params[:id])
end
private
def post_params
params.require(:post).permit(:title,:body)
end
end
это мой код формы:
<font color = "#BD004B"><h1>New Post<br></h1></font>
<%=form_for :post, url: posts_path do |f|%>
<p>
<%=f.label :title%><br>
<%=f.text_field :title%>
</p>
<p>
<%=f.label :body%><br>
<%=f.text_area :body%>
</p>
<p>
<%=f.submit%>
</p>
<%end%>
Это может быть либо отсутствующая часть представления, либо отсутствующий метод обратного вызова в контроллере, который пропускает действие проверки подлинности для запросов на публикацию / размещение / удаление. Так что, как просил @ D1ceWard, поделитесь кодом просмотра, и я также хотел бы увидеть код application_controller.rb.
@ D1ceWard я разместил код формы
@radoAngelov я разместил код формы
Это не form, это страница шоу. выложить содержимое posts/_form
Но вам нужна форма «Отправить», которая создает новое сообщение. Код общего просмотра не имеет значения :(
@radoAngelov извините, я вставил не тот файл, не задумываясь, добавил код формы сейчас
Проверьте, есть ли у вас <%= csrf_meta_tags %> в основном макете приложения. Если этого нет в основном макете, он понадобится вам на любой странице, на которой вы хотите разместить токен CSRF, например, в форме POST.
у меня это в моем файле application.html.erb
Хорошо, попробуйте добавить skip_before_action :verify_authenticity_token в ваш файл application_controller.rb.
Взгляните на stackoverflow.com/questions/3364492/…
@ldeld какой раздел поста?
@radoAngelov, который остановил ошибку, но теперь я получаю еще одну: undefined method 'title' for nil:NilClass из моего файла шоу, выделенная строка - <%[email protected]%>
@radoAngelov skip_before_action :verify_authenticity_token пропустить проверку токена, которая является проблемой безопасности и, кстати, не решением, нам нужна дополнительная информация, такая как все содержимое new / _form, маршрутизация, связанная с версией post и rails, потому что на данный момент все выглядит штрафом
undefined method 'title' for nil:NilClass это потому, что ваша переменная экземпляра в вашем контроллере называется @show, а не @post@ D1ceWard какая еще информация вам нужна
Прочтите выше, все содержимое new / _form, маршрутизация, связанная с версией post и rails.
@D1ceWard должен ли я заменить @show на @post или <%[email protected]%> на <%[email protected]%>@radoAngelov <%= csrf_meta_tags %> используются только для запросов ajax remote: true. Обычно метатеги отправляются через скрытый ввод. Можете ли вы привести пример параметров запуска tail -f log/development.log
Но я бы подумал, действительно ли вам стоит попробовать создать отдельную ветку в git или развернуть новое приложение rails и запустить генератор скаффолда, чтобы получить представление о том, как должен выглядеть контроллер rails crud. rails g scaffold post title body:text





Как отмечали другие, пропуск verify_authenticity_token не является вариантом и открывает большие дыры в безопасности вашего приложения.
Исключение обычно возникает в двух случаях: ваша сессия закончилась, наша форма отправлена через ajax без csrf_meta_tags.
Правильное решение проблемы - спасти исключение и сбросить сеанс пользователя следующим образом:
rescue_from ActionController::InvalidAuthenticityToken do
logger.info "Compromised session found."
reset_session
flash[:error] = "You're session has expired"
redirect_to root_path # or new_user_session_path
end
Я удалил его из своего файла application_controller.rb, и функциональность моего приложения не изменилась, так что я оставлю его
Вы можете поделиться кодом своей формы?