2017-10-02 79 views
0

私のfile_fieldタグは、ファイル自体をコントローラに渡すのではなく、ファイル名を渡しています。私のユーザモデルでRails file_fieldタグだけが文字列ファイル名をコントローラに渡します

​​

AvatarUploader:

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 

とユーザーコントローラ:

before_action :logged_in_user, only: [:index, :edit, :update, :destroy, :following, :followers] 
before_action :correct_user, only: [:edit, :update] 
before_action :admin_user, only: [:destroy] 
skip_before_action :verify_authenticity_token, only: [:create] 
... 
def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes user_params 
    flash[:success] = "Profile updated" 
    redirect_to user_path @user 
    else 
    render 'edit' 
    end 
end 
... 
def user_params 
    params.require(:user).permit :name, :email, :password, :password_confirmation, :avatar 
end 

def correct_user 
    @user = User.find params[:id] 
    redirect_to root_path unless @user == current_user 
end 

def admin_user 
    redirect_to root_path unless current_user.admin? 
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 %> 

コンソールでは、適切なActionDispatchではなく、「FinnJake.png」という属性が表示されています。

Processing by UsersController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"h9tD/g2M1zJ5L4cnysIQwHCWxDdhhhJR1I9a9+FAWeT9aTXPte16Uyn8GvI4w23klfvYtTaLCDrGVonHfmFUag==", "user"=>{"name"=>"Example User", "email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "avatar"=>"FinnJake.png"}, "commit"=>"Save Changes", "id"=>"1"} 
    User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 
    User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 
    CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 
    (0.1ms) begin transaction 
    User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) AND ("users"."id" != ?) LIMIT ? [["email", "[email protected]"], ["id", 1], ["LIMIT", 1]] 
    SQL (1.1ms) UPDATE "users" SET "avatar" = ?, "updated_at" = ? WHERE "users"."id" = ? [["avatar", nil], ["updated_at", "2017-10-02 14:50:41.226691"], ["id", 1]] 
    (142.3ms) commit transaction 
Redirected to https://rubyonrails-xxx.c9users.io/users/1 
Completed 302 Found in 155ms (ActiveRecord: 144.1ms) 

私は非常に新しいレールですが、file_fieldがファイルをアップロードしていない理由を理解できません。私はこのタグで終わることをブラウザで見ることができます:

<input accept="image/jpeg,image/gif,image/png" type="file" name="user[avatar]" id="user_avatar"> 
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: "[email protected]", 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", "[email protected]"], ["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 

ご迷惑をお掛けしなくても、レールコンソールから手動でその列を更新することはできません。

+0

あなたのフォームにhtml:{multipart:true}は必要ありませんか?私はあなたがペーパークリップで行うことを知っています。搬送波は絶対に使用しないでください。 –

答えて

0

が問題を発見参照してください。 this comment

本質的に、部分的なフォームは、異なるエンコードタイプを持つ別のフォームでラップされていました。

関連する問題