Rails 4 Неверный токен подлинности при сохранении параметра через ссылку
У меня есть Message
модель, которая имеет archived
param в моем приложении Rails 4. В представлении у меня есть button_to
который устанавливает archived
парам к true
, Эта функция ранее работала до того, как я добавил Devise и Mailer к Message
модель. Теперь, когда я нажимаю кнопку "архив", я получаю сообщение об ошибке "ActionController::InvalidAuthenticityToken". Единственное, что я нашел, чтобы избежать этой ошибки, это добавить skip_before_filter :verify_authenticity_token, :only => [:archive]
к моему Messages Controller
, Однако, когда я это делаю, это не сохраняет параметры.
Есть ли способ передать токен подлинности через ссылку button_to? Или есть лучший способ сделать это, не ставя под угрозу его безопасность?
Message.rb
class Message < ActiveRecord::Base
validates_presence_of :name, :email, :message
has_one :response
scope :unread, -> { where(viewed: nil)}
scope :viewed, -> { where(viewed: true)}
scope :inbox, -> { where(archived: nil)}
scope :archived, -> { where(archived: true)}
end
Messagescontroller.rb
class MessagesController < ApplicationController
include MessagesHelper
before_action :authenticate_admin!, :except => [:new]
def index
@viewed = Message.viewed
@unread = Message.unread
end
def new
@message = Message.new
end
def create
@message = Message.new(message_params)
if @message.save(message_params)
Messagemailer.message_created(@message).deliver_now
redirect_to root_path
flash.notice = "Message succesfully sent."
else
render "new"
flash.alert = "There was a problem sending your message: "
flash.alert += @message.errors.full_messages.join(", ")
end
end
def edit
@message = Message.find(params[:id])
end
def update
@message = Message.find(params[:id])
if @message.update(message_params)
redirect_to message_path(@message)
flash.notice = "Message succesfully sent."
else
render "edit"
flash.alert = "There was a problem updating the message: "
flash.alert += @message.errors.full_messages.join(", ")
end
end
def view
@message = Message.find(params[:id])
@message.viewed = true
if @message.save
redirect_to message_path(@message)
else
flash.alert = "There was a problem viewing the message"
end
end
def unview
@message = Message.find(params[:id])
@message.viewed = nil
if @message.save
redirect_to messages_path
else
flash.alert = "There was a problem un-viewing the message"
end
end
def show
@message = Message.find(params[:id])
end
def archive
@message = Message.find(params[:id])
if @message.save(:archived => true)
redirect_to messages_path
else
flash.alert = "There was a problem archiving the message"
render :show
end
end
end
MessagesHelper.rb
module MessagesHelper
def message_params
params.require(:message).permit(:name, :email, :subject, :message, :viewed, :responded, :archived)
end
end
Кнопка показа сообщений
<%= button_to 'Archive', message_archive_path(@message), :class => 'button' %></div>
Любая помощь приветствуется! Спасибо!
РЕДАКТИРОВАТЬ:
Это, очевидно, верно и во всех моих формах. Это проблема разработки?