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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

504閲覧

railsでユーザー情報が登録されません。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/07/24 17:41

編集2017/07/25 14:14

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

dalli = Dalli::Client.new('localhost:11211')
をコントローラーごとにやって、
dalliを初期化してしまっているからいけないのでは?
じゃあどうやって共通化するねんって話になりますが、
Railsはwebアプリなのでmethodごとに違うインスタンスをとる
createする時のcontrollerとindexする時のcontrollerは別インスタンスなので
色々試行錯誤するよりは

参考サイトの後半にあるように
config.cache_store = :dalli_store
として
Rails.cache.write 'signup_user',...
user = Rails.cache.read 'signup_user'
でmethodを跨いでデータを共有する方がいいと思います。

投稿2017/07/25 02:36

moke

総合スコア2241

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

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

退会済みユーザー

退会済みユーザー

2017/07/25 14:23

ご回答ありがとうございます。 コントローラーを修正してみたのですが、nameやemailなどのデータが保存されません。 insert文自体は発行されていますが、"created_at"と"updated_at"しか登録されていません。 confirmの下記のコードの後で、logger.debug(@user.name) とやるとユーザー名が出力されます。 if request.post? then @user = Rails.cache.read('signup_user') しかし、@user.save(validate: false)を実行すると整合性があっていない(?)のか 登録が正しく行われません。 何が間違っているのでしょうか。
moke

2017/07/25 14:45

ログ上に発行されたsqlがないか調べて下さい。 SQLが正しくて、登録できないなら DBの設定が間違っています。 もしくは一旦バリデーションを全て外して試してみてください。 また、textで作っているのが気になります。stringぐらいで十分でないでしょうか? プログラムの大半は このような問題の切り分けをやっていく作業です。orz 頑張って下さい
退会済みユーザー

退会済みユーザー

2017/07/25 15:03

なぜかコマンドプロンプトには下記のSQLが出力されていました。 insert into users (created_at, updated_at) values (?, ?) モデルを作成した時に自動的にnameなどのカラムも登録対象になると思っていたんですが、 必ずしもその通りにsqlを作成してくれるわけではないのでしょうか。 ちなみに、sqlite3を使用しています。 なのでカラム型はtextにしています。
moke

2017/07/25 15:16

うーむ、謎ですね、バリデーションをコメントアウトするのも、やってみて下さい。 あと、userのインスタンスではなく、パラメータをchache してみるのはどうでしょう?
退会済みユーザー

退会済みユーザー

2017/07/25 16:22

とりあえずなんとか解決できました。 明確にこれが原因とは言い切れませんが、モデル作成の過程でミスがあったのでは考えています。 (パスワードを暗号化する対応に誤りがあった) 今回の対処方法は下記の通りです。 1.userモデルを削除 2.項目を見直した上でモデルをgenerate   (passwordとしていた箇所をpassword_digestに変更) 3.rails db:migrate   (参考:http://qiita.com/chobi9999/items/20b962a324a0bdbfc0dc) 4.モデルファイルのuser.rbに、以前のuser.rbの記述を一部削除した上で処理を追加   ※削除した内容    include ActiveModel::Model    attr_accessor :name, :email, :password, :password_confirmation 5.登録処理を実行 これで次のステップに進められます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問