🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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

解決済

2回答

2892閲覧

deviseを使ったユーザー登録時に、imageカラムの初期値が保存できない

yuma11

総合スコア4

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クリップ

投稿2019/11/12 01:32

前提・実現したいこと

ユーザー登録時に、image(ユーザー画像)の初期値をデータベースに登録したい。

発生している問題・エラーメッセージ

railsのdeviseを使用しているので、deviseのコントローラーをカスタマイズし、imageの初期値を保存できるようにしようとしたのですが上手くいきません。

![イメージ説明

該当のソースコード

application_controller.rb

ruby

1class ApplicationController < ActionController::Base 2 before_action :configure_permitted_parameters, if: :devise_controller? 3 4 protected 5 6 def configure_permitted_parameters 7 devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :image]) 8 devise_parameter_sanitizer.permit(:account_update, keys: [:image]) 9 end 10 11end

registrations_controller.rb

ruby

1# frozen_string_literal: true 2 3class Users::RegistrationsController < Devise::RegistrationsController 4 # before_action :configure_sign_up_params, only: [:create] 5 # before_action :configure_account_update_params, only: [:update] 6 7 # GET /resource/sign_up 8 # def new 9 # super 10 # end 11 12 # POST /resource 13 def create 14 user = User.new(user_params) 15 user.save 16 redirect_to root_path 17 end 18 19 # GET /resource/edit 20 # def edit 21 # super 22 # end 23 24 # PUT /resource 25 # def update 26 # super 27 # end 28 29 # DELETE /resource 30 # def destroy 31 # super 32 # end 33 34 # GET /resource/cancel 35 # Forces the session data which is usually expired after sign 36 # in to be expired now. This is useful if the user wants to 37 # cancel oauth signing in/up in the middle of the process, 38 # removing all OAuth session data. 39 # def cancel 40 # super 41 # end 42 43 # protected 44 45 # If you have extra params to permit, append them to the sanitizer. 46 # def configure_sign_up_params 47 # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute]) 48 # end 49 50 # If you have extra params to permit, append them to the sanitizer. 51 # def configure_account_update_params 52 # devise_parameter_sanitizer.permit(:account_update, keys: [:attribute]) 53 # end 54 55 # The path used after sign up. 56 # def after_sign_up_path_for(resource) 57 # super(resource) 58 # end 59 60 # The path used after sign up for inactive accounts. 61 # def after_inactive_sign_up_path_for(resource) 62 # super(resource) 63 # end 64 65 private 66 def user_params 67 params.require(:user).permit(:name, :email, :password).merge(image: "sample.jpg") 68 end 69end 70

試したこと

ストロングパラメーターにmergeメソッドでimageを追加して、binding.pryで確認をしたところimageに値が入っているのに、何故か上のエラー画面になりデータベースに保存することができません。

イメージ説明
他にも、マイグレーションファイルのimageカラムにdefault "sample.jpg"等を追加したりもしましたが、その方法だとデータベースに保存はできるのですが、表示ができなかったのでやめました。

どなたか解決策をお願い致します。

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

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

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

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

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

guest

回答2

0

自己解決

指摘していただいた場所を確認し、変更してみましたが結局初期値としてデータベースに保存することはできなかったので、Image_uploder.rbにデフォルト画像を設定する記述をし解決致しました。

ruby

1def default_url(*args) 2 # # For Rails 3.1+ asset pipeline compatibility: 3 # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) 4 "sample.jpg" 5 # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 6 end

投稿2019/11/12 04:06

yuma11

総合スコア4

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

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

0

deviseを使ったことがないので詳しくはわからず申し訳ないんですが、ソースコードを見ていると

rb

1 def create 2 build_resource(sign_up_params) 3 4 resource.save 5 yield resource if block_given? 6 if resource.persisted? 7 if resource.active_for_authentication? 8 set_flash_message! :notice, :signed_up 9 sign_up(resource_name, resource) 10 respond_with resource, location: after_sign_up_path_for(resource) 11 else 12 set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}" 13 expire_data_after_sign_in! 14 respond_with resource, location: after_inactive_sign_up_path_for(resource) 15 end 16 else 17 clean_up_passwords resource 18 set_minimum_password_length 19 respond_with resource 20 end 21 end

とあるので、build_resource(sign_up_params)resource.saveでレコードを作成・保存する必要があるのではないでしょうか?
提出されているサンプルだと、createメソッドを完全に書き換えてしまっていてDeviseを使っている意味すらなくなってしまっているように思えます。

rb

def user_params
params.require(:user).permit(:name, :email, :password).merge(image: "sample.jpg")
end

これも独自で追加されたものだと思いますが、deviseのソースコードを見ると以下のメソッドが用意されているので、こちらを使うべきなのではないでしょうか?

rb

1 def sign_up_params 2 devise_parameter_sanitizer.sanitize(:sign_up) 3 end

追記

それっぽいメソッドがコメントアウトされていますね、user_paramsを作成するのではなくてこちらを弄ってみてはどうでしょうか?

rb

1 # If you have extra params to permit, append them to the sanitizer. 2 # def configure_sign_up_params 3 # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute]) 4 # end

最初に申し上げた通りdevise自体は使ったことがないのであくまで参考程度に何かの手がかりになれば幸いです。

投稿2019/11/12 02:05

編集2019/11/12 02:08
Mugheart

総合スコア2349

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問