######質問内容
現在、オリジナルアプリを作成中です。
wizard形式のユーザー新規登録で、ユーザー本人の画像を保存して、
トップページに表示できるようにしたいです。
1ページ目→ユーザー情報入力 2ページ目→アンケート内容入力
3ページ目→登録完了
usersテーブルとquestionnairesテーブル(アンケート)に値は保存できるのですが、
active_storageのテーブルには画像を保存できません。
######試したこと
- registrations_controllerを以下のように変更
→しかし、うまくいかず。
class Users::RegistrationsController < Devise::RegistrationsController before_action :configure_sign_up_params, only: [:create] def new super end def create @user = User.new(sign_up_params) unless @user.valid? render :new and return end session["devise.regist_data"] = {user: @user.attributes} session["devise.regist_data"][:user]["password"] = params[:user][:password] @questionnaire = @user.build_questionnaire render :new_questionnaire end def create_questionnaire @user = User.new(session["devise.regist_data"]["user"]) @questionnaire = Questionnaire.new(questionnaire_params) unless @questionnaire.valid? render :new_questionnaire and return end @user.build_questionnaire(@questionnaire.attributes) @user.save session["devise.regist_data"]["user"].clear sign_in(:user, @user) end protected def configure_sign_up_params devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :image, :gender_id, :birth_day]) end def questionnaire_params params.require(:questionnaire).permit(:book_category_id, :book_genre_id, :purchase_place_id, :reading_type_id) end end
- privateの表記をprotectedに変更
→効果なし。
####### config/routes.rb
Rails.application.routes.draw do devise_for :users, controllers: { registrations: 'users/registrations' } devise_scope :user do get 'questionnaires', to: 'users/registrations#new_questionnaire' post 'questionnaires', to: 'users/registrations#create_questionnaire' end root to: "books#index" end
######application_controller.rb
class ApplicationController < ActionController::Base before_action :basic_auth before_action :configure_permitted_parameters, if: :devise_controller? private def basic_auth authenticate_or_request_with_http_basic do |username, password| username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"] # 環境変数を読み込む記述に変更 end end def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :image, :gender_id, :birth_day]) end end
registrations_controller
def new @user = User.new end def create @user = User.new(sign_up_params) unless @user.valid? render :new and return end session["devise.regist_data"] = {user: @user.attributes} session["devise.regist_data"][:user]["password"] = params[:user][:password] @questionnaire = @user.build_questionnaire render :new_questionnaire end def create_questionnaire @user = User.new(session["devise.regist_data"]["user"]) @questionnaire = Questionnaire.new(questionnaire_params) @questionnaire.user_id = @user.id unless @questionnaire.valid? render :new_questionnaire and return end @user.build_questionnaire(@questionnaire.attributes) @user.save session["devise.regist_data"]["user"].clear sign_in(:user, @user) end private def questionnaire_params params.require(:questionnaire).permit(:book_category_id, :book_genre_id, :purchase_place_id, :reading_type_id) end
models/user.rb
class User < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_one_attached :image has_one :questionnaire belongs_to_active_hash :gender has_many :books has_many :comments with_options presence: true do validates :nickname, length: { maximum: 12} validates :birth_day, :email validates :password, length: { minimum: 12, maximum: 20 }, format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: 'は半角英数混合で入力してください。' } end # active_hashのデータ validates :gender_id, numericality: { other_than: 0 , message: 'を入力してください'} end
######views/shared/_header.html.erb
<ul class='layout-change'> <% if user_signed_in? %> <div class="login-condition"> <li>ログインしています</li> <li class="user-nickname"><%= current_user.nickname %></li> <% if current_user.image.attached? %> <li><%= image_tag current_user.image, width: "45", height: "45", id: 'user-image' %></li> <% else%> <li><%= image_tag "no-image.png", width: "45", height: "45", id: 'user-image' %></li> <% end %> </div> <% else %> <div class="not-login-condition"> <li> はじめての方はこちら <%= link_to(new_user_session_path, class:'sign-in-btn', id:"orange-btn") do %> <span class="sign-btn-text">ログイン</span> <% end %> </li> <li> <%= link_to(new_user_registration_path, class:'sign-up-btn', id:"blue-btn") do %> <span class="sign-btn-text">新規登録</span> <% end %> </li> </div> <% end %> </ul>
非常に長くなってしまいました。
何か助言などがありましたら、コメントお願いします!
あなたの回答
tips
プレビュー