railsでユーザー情報の登録機能を作成しています。
入力画面(index)、確認画面(confirm)、登録完了画面(complete)とページ遷移を行います。
確認画面にデータを表示させるところまでは作成できたのですが、
確認画面で登録ボタンを押すと、id・作成日時・更新日時のみが登録され、
ユーザ名、Email、パスワードなどがDB上に反映されません。
sqlite3で検索をかけてみると「ID||||||作成日時|更新日時」のように表示されます。
class SignupController < ApplicationController layout 'info_get' protect_from_forgery include SessionManagement before_action :is_session, only: [:index, :confirm] before_action :sign_in!, only: [:complete] def index @title = 'ユーザー情報入力' @errMsg = Hash.new dalli = Dalli::Client.new('localhost:11211') if request.get? then @user = User.new if dalli.get('signup_user') != nil then signup_user = dalli.get('signup_user') @user.name = signup_user.name @user.email = signup_user.email end else @user = User.new user_params if @user.valid? then dalli.set('signup_user', @user) redirect_to '/signup/confirm' else #エラーメッセージの連想配列を生成 @user.errors.messages.each do |key, val| if key == :password_confirmation && !@errMsg.has_key?(:password) then @errMsg[:password] = val[0] next end @errMsg[key] = val[0] end end end end def confirm @title = 'ユーザー情報入力確認' dalli = Dalli::Client.new('localhost:11211') if request.post? then @user = User.new user_params if @user.save(validate: false) then login_user = User.find_by(email: @user.email) if login_user && login_user.authenticate(@user.password) then dalli.delete('signup_user') reset_session dalli.set('login_user', login_user) redirect_to '/signup/complete' end else end redirect_to '/signup/confirm' else @user = dalli.get('signup_user') end end def complete @title = 'ユーザー情報登録完了' end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end
確認画面でフォームを実装しているコードは下記になります。
<%= form_for(@user, url:{controller: 'signup', action: 'confirm'}) do |f| %> <%= f.hidden_field :name %> <%= f.hidden_field :email %> <%= f.hidden_field :password %> <%= f.hidden_field :password_confirmation %> <input type="button" value="戻る" onClick="location.href='/signup'"> <%= f.submit '登録' %> <% end %>
DBテーブルのスキーマは下記の通りです。
create_table "users", force: :cascade do |t| t.text "name" t.text "email" t.text "password_digest" t.text "kari_password" t.text "kari_created_at" t.text "session_id" t.text "lastlogin_at" t.datetime "created_at", null: false t.datetime "updated_at", null: false end
前提として、scaffoldを使用していません。
また、セッション管理の為にmemchachedを使用しています。
どのように対処したらよいのでしょうか。
2017/7/25追記
下記の修正を施しました。
■修正後のコントローラー
class SignupController < ApplicationController layout 'info_get' protect_from_forgery include SessionManagement before_action :is_session, only: [:index, :confirm] before_action :sign_in!, only: [:complete] def index @title = 'ユーザー情報入力' @errMsg = Hash.new if request.get? then @user = User.new if Rails.cache.exist?('signup_user') then signup_user = Rails.cache.read('signup_user') @user.name = signup_user.name @user.email = signup_user.email end else @user = User.new user_params if @user.valid? then Rails.cache.write('signup_user', @user) redirect_to '/signup/confirm' else #エラーメッセージの連想配列を生成 @user.errors.messages.each do |key, val| if key == :password_confirmation && !@errMsg.has_key?(:password) then @errMsg[:password] = val[0] next end @errMsg[key] = val[0] end end end end def confirm @title = 'ユーザー情報入力確認' if request.post? then @user = Rails.cache.read('signup_user') if @user.save(validate: false) then login_user = User.find_by(email: @user.email) if login_user && login_user.authenticate(@user.password) then Rails.cache.delete('signup_user') Rails.cache.write('login_user', login_user) redirect_to '/signup/complete' end end redirect_to '/signup/confirm' else @user = Rails.cache.read('signup_user') end end def complete @title = 'ユーザー情報登録完了' end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end
■userモデル
class User < ApplicationRecord include ActiveModel::Model has_secure_password validations: false attr_accessor :name, :email, :password, :password_confirmation validates :name, presence: {message: 'ユーザー名を入力して下さい。'} validates :email, presence: {message: 'Emailを入力して下さい。'} validates :password, presence: {message: 'パスワードを入力して下さい。'} end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/07/25 14:23
2017/07/25 14:45
退会済みユーザー
2017/07/25 15:03
2017/07/25 15:16
退会済みユーザー
2017/07/25 16:22