Ruby Rails 活动存储异常

Ruby Rails Active Storage Exception

我正在 Ruby 的 Rails 中开发一个项目,我刚刚将 Active Storage 添加到其中。它抛出一个异常,我不太明白。目的只是为了让新注册用户上传头像图像。在这种情况下称为:avatar_pic

Ruby 2.6.5 Rails5.2.4

错误:

ActiveSupport::MessageEncryptor::InvalidMessage in UsersController#create
ActiveSupport::MessageEncryptor::InvalidMessage

Rails.root: /home/drew/code/epicodus/mario
Application Trace | Framework Trace | Full Trace

(erb):12:in `<main>'
app/controllers/users_controller.rb:8:in `create'

Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"LzeQ0IRBGGtNtKYt6z-NLGfLJJq4VVWy2KGkLa5aMAxDibOQQlKsPnbmIW6ZWkLJmUYGirKDW70bS2GLO0eNXw",
 "user"=>
  {"email"=>"i_mojo_jojo@yahoo.com",
   "password"=>"[FILTERED]",
   "password_confirmation"=>"[FILTERED]",
   "avatar_pic"=>
    #<ActionDispatch::Http::UploadedFile:0x00007f3e3879bb48
     @content_type="image/webp",
     @headers="Content-Disposition: form-data; name=\"user[avatar_pic]\"; filename=\"1778557mojo_jojo_cropped.webp\"\r\n" + "Content-Type: image/webp\r\n",
     @original_filename="1778557mojo_jojo_cropped.webp",
     @tempfile=#<File:/tmp/RackMultipart20210402-20294-1gntmpk.webp>>,
   "admin"=>"1"},
 "commit"=>"Sign Up"}

Toggle session dump
Toggle env dump
Response

Headers:

None

Rails 服务器说:

    enteStarted GET "/signup" for 127.0.0.1 at 2021-04-02 14:18:21 -0700
Processing by UsersController#new as HTML
  Rendering users/new.html.erb within layouts/application
  Rendered users/new.html.erb within layouts/application (12.3ms)
  Rendered layouts/_header.html.erb (2.5ms)
  Rendered layouts/_navbar.html.erb (1.5ms)
Completed 200 OK in 103ms (Views: 93.7ms | ActiveRecord: 0.0ms)


Started GET "/signup" for 127.0.0.1 at 2021-04-02 14:18:37 -0700
Processing by UsersController#new as HTML
  Rendering users/new.html.erb within layouts/application
  Rendered users/new.html.erb within layouts/application (5.3ms)
  Rendered layouts/_header.html.erb (1.8ms)
  Rendered layouts/_navbar.html.erb (1.5ms)
Completed 200 OK in 52ms (Views: 50.5ms | ActiveRecord: 0.0ms)


Started POST "/users" for 127.0.0.1 at 2021-04-02 14:29:09 -0700
Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"XhEhZj9D8m_uamyYLt-IjQaVtNyrhQKz47DN1zjmkbwyrwIm-VBGOtU469tcukdo-BiWzKFTDLwgWghxrfss7w", "user"=>{"email"=>"i_mojo_jojo@yahoo.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "avatar_pic"=>#<ActionDispatch::Http::UploadedFile:0x00007f3e34d71ff8 @tempfile=#<Tempfile:/tmp/RackMultipart20210402-20294-1rjp10e.webp>, @original_filename="1778557mojo_jojo_cropped.webp", @content_type="image/webp", @headers="Content-Disposition: form-data; name=\"user[avatar_pic]\"; filename=\"1778557mojo_jojo_cropped.webp\"\r\nContent-Type: image/webp\r\n">, "admin"=>"1"}, "commit"=>"Sign Up"}
Completed 500 Internal Server Error in 31ms (ActiveRecord: 9.2ms)


  
ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage):
  
(erb):12:in `<main>'
app/controllers/users_controller.rb:8:in `create'
Started GET "/signup" for 127.0.0.1 at 2021-04-02 14:39:11 -0700
Processing by UsersController#new as HTML
  Rendering users/new.html.erb within layouts/application
  Rendered users/new.html.erb within layouts/application (2.6ms)
  Rendered layouts/_header.html.erb (1.2ms)
  Rendered layouts/_navbar.html.erb (1.0ms)
Completed 200 OK in 50ms (Views: 30.4ms | ActiveRecord: 6.8ms)


Started POST "/users" for 127.0.0.1 at 2021-04-02 14:39:18 -0700
Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"LkVpArq_38Esb10kyWy_dKpK60_r5OIuFNGBNS4n1PtC-0pCfKxrlBc92me7CXCRVMfJX-Ey7CHXO0STuzppqA", "user"=>{"email"=>"i_mojo_jojo@yahoo.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "avatar_pic"=>#<ActionDispatch::Http::UploadedFile:0x00007f3e38d978a8 @tempfile=#<Tempfile:/tmp/RackMultipart20210402-20294-171sahq.webp>, @original_filename="1778557mojo_jojo_cropped.webp", @content_type="image/webp", @headers="Content-Disposition: form-data; name=\"user[avatar_pic]\"; filename=\"1778557mojo_jojo_cropped.webp\"\r\nContent-Type: image/webp\r\n">, "admin"=>"1"}, "commit"=>"Sign Up"}
Unpermitted parameter: :avatar_pic
Completed 500 Internal Server Error in 13ms (ActiveRecord: 2.6ms)


  
ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage):
  
(erb):12:in `<main>'
app/controllers/users_controller.rb:9:in `create'
Started GET "/signup" for 127.0.0.1 at 2021-04-02 14:39:51 -0700
Processing by UsersController#new as HTML
  Rendering users/new.html.erb within layouts/application
  Rendered users/new.html.erb within layouts/application (5.1ms)
  Rendered layouts/_header.html.erb (2.4ms)
  Rendered layouts/_navbar.html.erb (1.3ms)
Completed 200 OK in 80ms (Views: 60.3ms | ActiveRecord: 4.9ms)


Started POST "/users" for 127.0.0.1 at 2021-04-02 14:39:57 -0700
Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"LzeQ0IRBGGtNtKYt6z-NLGfLJJq4VVWy2KGkLa5aMAxDibOQQlKsPnbmIW6ZWkLJmUYGirKDW70bS2GLO0eNXw", "user"=>{"email"=>"i_mojo_jojo@yahoo.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "avatar_pic"=>#<ActionDispatch::Http::UploadedFile:0x00007f3e3879bb48 @tempfile=#<Tempfile:/tmp/RackMultipart20210402-20294-1gntmpk.webp>, @original_filename="1778557mojo_jojo_cropped.webp", @content_type="image/webp", @headers="Content-Disposition: form-data; name=\"user[avatar_pic]\"; filename=\"1778557mojo_jojo_cropped.webp\"\r\nContent-Type: image/webp\r\n">, "admin"=>"1"}, "commit"=>"Sign Up"}
Completed 500 Internal Server Error in 15ms (ActiveRecord: 3.7ms)


  
ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage):
  
(erb):12:in `<main>'
app/controllers/users_controller.rb:8:in `create'
r code here

我的模特:

  class User < ApplicationRecord
  attr_accessor :password
  validates_confirmation_of :password
  validates :email, :presence => true, :uniqueness => true
  before_save :encrypt_password

  has_one_attached :avatar_pic

  def encrypt_password
    self.password_salt = BCrypt::Engine.generate_salt
    self.password_hash = BCrypt::Engine.hash_secret(password,password_salt)
  end

  def self.authenticate(email, password)
    user = User.find_by "email = ?", email
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end
end

我的控制器:

    class UsersController < ApplicationController

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    @user.avatar_pic.attach(params[:user][:avatar_pic])
    if @user.save
      flash[:notice] = "You've successfully signed up!"
      session[:user_id] = @user.id
      redirect_to "/"
    else
      flash[:alert] = "There was a problem signing up."
      redirect_to '/signup'
    end
  end

  private

  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation, :admin, :avatar_pic)
  end
end

我的观点:

    <%= form_for @user do |f| %>
  <%= f.label "Email" %>
  <%= f.text_field :email, id: 'registration_email'  %>
  <%= f.label "Password" %>
  <%= f.password_field :password,  id: 'registration_password' %>
  <%= f.label "Password confirmation" %>
  <%= f.password_field :password_confirmation,  id: 'reg_password_confirm' %>
  <br>
  <%= f.label "Upload Avatar Image" %>  
  <%= f.file_field :avatar_pic  %>
  <br>
  <%= f.label "Admin?", name: 'admin_check', id: 'admin_check' %>
  <%= f.check_box:admin %>
  <br>
  <%= f.submit "Sign Up" %>
<% end %>

看来图片上传没问题。我认为我的控制器参数是问题所在,它没有验证....某事。但我不知道如何。我认为它在参数中。我被难住了。

好的,所以我找到了问题。我已经复制了这个 repo,它最初是在不同的系统上开发的。我没有 master.key(当时我不知道它存在)。

https://github.com/rails/rails/issues/33463

我按照 Vladimir-19 的指示解决了问题。