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>

Любая помощь приветствуется! Спасибо!

РЕДАКТИРОВАТЬ:

Это, очевидно, верно и во всех моих формах. Это проблема разработки?

0 ответов

Другие вопросы по тегам