質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2060閲覧

devise/画像をup出来ない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/11/24 01:55

編集2018/11/24 16:09

実現したいこと

deviseで認証機能を実装しています。
ユーザー編集時にプロフィール写真をアップできるようにしたいと考えています。

HTML

1<!-- index.html.erb ユーザー一覧ページ--> 2<img src="<%= "/user_images/#{user.image_name}" %>">

ruby

1//users_controller.rb 2class UsersController < ApplicationController 3 def index 4 @users = User.all 5 end 6 7 def show 8 @user = User.find_by(id: params[:id]) 9 end 10 11 def new 12 @user = User.new 13 end 14 15 def create 16 @user = User.new( 17 name: params[:name], 18 email: params[:email], 19 image_name: "default_user.jpg", 20 ) 21 if @user.save 22 session[:user_id] = @user.id 23 flash[:notice] = "ユーザー登録が完了しました" 24 redirect_to("/users/#{@user.id}") 25 else 26 render("users/new") 27 end 28 end 29 30 def edit 31 @user = User.find_by(id: params[:id]) 32 end 33 34 def update 35 @user = User.find_by(id: params[:id]) 36 @user.name =params[:name] 37 @user.email = params[:email] 38 39 if params[:image] 40 @user.image_name = "#{@user.id}.jpg" 41 image = params[:image] 42 File.binwrite("public/user_images/#{@user.image_name}", image.read) 43 end 44 end 45 46end

ruby

1//application.html.rb 2class ApplicationController < ActionController::Base 3 protect_from_forgery with: :exception 4 before_action :authenticate_user!, only: [:/] 5 before_action :configure_permitted_parameters, if: :devise_controller? 6 7 protected 8 def configure_permitted_parameters 9 devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :image]) 10 devise_parameter_sanitizer.permit(:account_update, keys: [:name]) 11 end 12end 13

HTML

1<!-- app/views/devise/registrations/edit.html.erb --> 2<%= form_tag("/users/#{@user.id}/update", {multipart: true}) do %> 3 <p><%= f.label :image_name %><br /></p> 4 <%= f.file_field :image_name %>

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

controller側の処理は記述しましたでしょうか?

application_controller.rbで

class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:image]) end end

のようにconfigure_permitted_parametersの中にsign_up以外のキーも含めることで、deviseのデフォルトのカラム以外にも登録できるようになります。

投稿2018/11/24 02:48

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/24 03:21

質問に追記しました。 一応、:imageは書いているのですが書き方がダメなのでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/24 04:15 編集

少し誤解しておりました。編集時でしたね。ということは、account_updateの方にもimageを追加しなければなりませんね。 def configure_permitted_parameters  devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :image])  devise_parameter_sanitizer.permit(:account_update, keys: [:name, :image]) # <= :imageを追加 end
退会済みユーザー

退会済みユーザー

2018/11/24 04:30

upadateに追記すると、ActionController::InvalidAuthenticityToken in Devise::RegistrationsController#updateというエラーが出てしまいます。 すごく初歩的な質問なんですが、imageのカラムをまだ作っていないのですがそれが原因なのでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/24 06:35

そうですね少なくともimageのカラムを作らなければならないのは確かです。おそらくUnknownAttributeErrorが起きるはずで、エラーが起きないとしても確実にデータは登録されません。ただ、今回はInvalidAuthenticityTokenなので少し様子が違うようですね。より詳しいエラー情報はありますか? また、通常deviseを使う場合はデフォルトでusers/sign_upパスが用意されており、Usersコントローラーを作成しなくてuserの作成はできるはずです。Usersコントローラーを作ってしまったことによりどのような挙動になるのか試していないのでわかりませんが、通常の作成動作と同様にstrongパラムスのエラーで引っかかる可能性はあるかと思います。
退会済みユーザー

退会済みユーザー

2018/11/24 16:09

今現在の画像をアップするのに必要そうな箇所全て、質問欄にコードを追記しました。 カラムはdeviseのマイグレーションファイルとは他に、新たにファイルを作り画像用のimage_nameカラムを作りました。 現コードでは、実際に編集欄で画像を選択して更新してもエラーは出ないのですが、写真が反映されていない状況です。 それと、デフォルト時の画像を準備しているのですが読み込まれていないのか反映されていません。 しかし、<img src="/user_images/default_user.png">のように特定すると表示されます。 コードや実装方法は受講しているprogateを参考にしています。
退会済みユーザー

退会済みユーザー

2018/11/24 22:37 編集

:image, :image_name は別物ですか? もし別物なら登録したいものすべて記述しなければできません。ちなみに写真を登録する際に写真に名前をつける必要はないかと思います。また通常imageカラムにはその写真が保存されているpathを保存します。 def configure_permitted_parameters  devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :image, :image_name])  devise_parameter_sanitizer.permit(:account_update, keys: [:name, :image, :image_name]) end またUsersControllerの中身ですが、 def update  @user = User.find(id: params[:id])  @user.update(user_params) end private def user_params  params.require(:user).permit(:name, :email, image_name) end とすればいけるかもしれません。ただし、前にも述べましたが、わざわざUsersControllerを作成せずともアカウントのアップデートはデフォルトのdeviseを使って行うことができます。
退会済みユーザー

退会済みユーザー

2018/11/25 16:25

回答ありがとうございます。一応、ご教示していただいた通りに実装したところ画像を表示させることが出来ました。しかし今回、自力で実装してみて大変だったので 今度時間あるときに、gemのCarrierWaveを使ってみたいと思います。 長々と何度もお聞きしてしまい申し訳ございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問