Ruby on rails Rails文件\仅将字符串文件名传递给控制器的字段标记

Ruby on rails Rails文件\仅将字符串文件名传递给控制器的字段标记,ruby-on-rails,string,filefield,Ruby On Rails,String,Filefield,My file_field标记仅将文件名而不是文件本身传递给控制器 在我的用户模型中: mount_uploader :avatar, AvatarUploader validate :avatar_size ... def avatar_size errors.add :avatar, "should be less than 5MB" if avatar.size > 5.megabytes end 阿凡达头像: class AvatarUploader < Carrier

My file_field标记仅将文件名而不是文件本身传递给控制器

在我的用户模型中:

mount_uploader :avatar, AvatarUploader
validate :avatar_size
...
def avatar_size
  errors.add :avatar, "should be less than 5MB" if avatar.size > 5.megabytes
end
阿凡达头像:

class AvatarUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick
  process resize_to_limit: [50, 50]

  if Rails.env.production?
    storage :fog
  else
    storage :file
  end

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def extension_white_list
    %w(jpg, jpeg, gif, png)
  end

end
视图中的窗体:

<%= form_for(@user) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>

  <%= f.label :name %>
  <%= f.text_field :name, class: 'form-control' %>

  <%= f.label :email %>
  <%= f.email_field :email, class: 'form-control' %>

  <%= f.label :password %>
  <%= f.password_field :password, class: 'form-control' %>

  <%= f.label :password_confirmation %>
  <%= f.password_field :password_confirmation, class: 'form-control' %>

  <% if @user.avatar? %>
    <%= image_tag @user.avatar.url, size: "50x50" %>
  <% else %>
    <%= image_tag "stock_ava.png", size: "50x50" %>
  <% end %>

  <%= f.file_field :avatar, accept: 'image/jpeg,image/gif,image/png' %>

  <%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>
我对rails非常陌生,但我不明白为什么file_字段没有上传文件。我可以在浏览器中看到,我以以下标记结束:

<input accept="image/jpeg,image/gif,image/png" type="file" name="user[avatar]" id="user_avatar">
在我看来这是正确的。我似乎也无法通过rails控制台手动更新该列,尽管我没有收到任何错误:

2.4.0 :002 > user = User.first
  User Load (0.5ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
 => #<User id: 1, name: "Example User", email: "example@user.com", created_at: "2017-10-02 14:32:22", updated_at: "2017-10-02 16:35:55", password_digest: "$2a$10$sww7gItks0mYz6xz8zV.QOIjr6to/o5Jytjmuo0wxny...", remember_digest: nil, admin: true, activation_digest: "$2a$10$W396r7A8aZaii3DC7b3W7u70etSmXh3MORMIoWtcSHo...", activated_at: "2017-10-02 14:32:22", reset_digest: nil, reset_sent_at: nil, avatar: nil> 
2.4.0 :003 > user.update avatar: "String"
   (0.2ms)  begin transaction
  User Exists (0.4ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ?  [["email", "example@user.com"], ["id", 1], ["LIMIT", 1]]
  SQL (2.4ms)  UPDATE "users" SET "updated_at" = ?, "avatar" = ? WHERE "users"."id" = ?  [["updated_at", "2017-10-02 17:27:06.097363"], ["avatar", nil], ["id", 1]]
   (11.4ms)  commit transaction
 => true 

提前感谢您提供的任何建议。

您应该使用多部分表单,如:

form_for(@user, html: { multipart: true }) do ...
请参见找到问题。看


本质上,部分中的表单被另一个具有不同编码类型的表单包装。

表单中不需要html:{multipart:true}吗?我知道你用回形针。从未使用过carrierwave。与轨道6一起使用
2.4.0 :002 > user = User.first
  User Load (0.5ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
 => #<User id: 1, name: "Example User", email: "example@user.com", created_at: "2017-10-02 14:32:22", updated_at: "2017-10-02 16:35:55", password_digest: "$2a$10$sww7gItks0mYz6xz8zV.QOIjr6to/o5Jytjmuo0wxny...", remember_digest: nil, admin: true, activation_digest: "$2a$10$W396r7A8aZaii3DC7b3W7u70etSmXh3MORMIoWtcSHo...", activated_at: "2017-10-02 14:32:22", reset_digest: nil, reset_sent_at: nil, avatar: nil> 
2.4.0 :003 > user.update avatar: "String"
   (0.2ms)  begin transaction
  User Exists (0.4ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ?  [["email", "example@user.com"], ["id", 1], ["LIMIT", 1]]
  SQL (2.4ms)  UPDATE "users" SET "updated_at" = ?, "avatar" = ? WHERE "users"."id" = ?  [["updated_at", "2017-10-02 17:27:06.097363"], ["avatar", nil], ["id", 1]]
   (11.4ms)  commit transaction
 => true 
form_for(@user, html: { multipart: true }) do ...