質問編集履歴

5 routes.rbを追加

ayachika

ayachika score 34

2018/11/01 21:49  投稿

新規ユーザー登録しようとするとパスワード入力後空になって登録ページに戻ってしまう問題について
railsチュートリアルに沿ってアプリを学習中のrails歴4ヶ月の初心者です。
ログイン機能について実装し、正常に動いていたのですが、チュートリアル13章の「ユーザ情報についてデータベースをリセットする。」という指示のあと、ログインできないため(ユーザがいないため)、新規でユーザーを登録しようとしたところ、新規ユーザー登録のための氏名、email、パスワードを入力すると、ページ遷移せずに、そのままパスワードの欄が空になり元の新規登録のページに戻ってしまうというエラー?が発生しています。
新規登録にあたるコードはいじっていないですし、railsチュートリアルに戻ってコードの確認をしてもコードに変更はないため、なぜこうなるのかわかりません。
エラー画面も、新規登録時のフラッシュ(パスワードが抜けています等)は一切発生していません。
以下にコードを記載します。
どなたか、似たような現象に遭遇した方、解決方法についてご助言いただける方教えていただけると幸いです。
・ユーザーモデル
```userモデル
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :name
     t.string :email
     t.timestamps
   end
 end
end
```
・user.rb
```user.rb
# == Schema Information
#
# Table name: users
#
# id             :integer         not null, primary key
# email          :string
# name           :string
# password_digest :string
# remember_digest :string
# created_at     :datetime        not null
# updated_at     :datetime        not null
#
# Indexes
#
# index_users_on_email (email) UNIQUE
#
class User < ApplicationRecord
   has_many:posts
   before_save { email.downcase! }
   validates :name, presence: true, length: { maximum: 50 }
   VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
   validates :email, presence: true, length: { maximum: 255 },
                           format: { with: VALID_EMAIL_REGEX },
                           uniqueness: { case_sensitive: false }
   has_secure_password
   validates :password, presence: true, length: { minimum: 6 }
   # 渡された文字列のハッシュ値を返す
 def self.digest(string)
   cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                 BCrypt::Engine.cost
   BCrypt::Password.create(string, cost: cost)
 end
# ランダムなトークンを返す
 def self.new_token
   SecureRandom.urlsafe_base64
 end
# 永続セッションのためにユーザーをデータベースに記憶する
 def remember
   self.remember_token = User.new_token
   update_attribute(:remember_digest, User.digest(remember_token))
 end
# 渡されたトークンがダイジェストと一致したらtrueを返す
 def authenticated?(remember_token)
   return false if remember_digest.nil?
   BCrypt::Password.new(remember_digest).is_password?(remember_token)
 end
 # ユーザーのログイン情報を破棄する
 def forget
   update_attribute(:remember_digest, nil)
 end
 belongs_to :user
 
 #favorite機能をつけた時に追加
 has_many :favorites, through: :favorites, source: :post, dependent: :destroy
 has_many :posts, through: :favorites
 has_many :posts, dependent: :destroy
end
```
・users_controller.rb
```ここに言語を入力
class UsersController < ApplicationController
 def show
   @user = User.find(params[:id])
   @user = User.find(params[:id])
   @posts = @user.posts.paginate(page: params[:page])
   # モデルクラスのwhereメソッドへ検索カラムと値を渡すと合致するモデルを配列形式で返却
   #@posts = Post.where(:user_id, @user.id)
 end
 def new
   @user = User.new
 end
 
 def create
   @user = User.new(user_params) 
   if @user.save
     log_in @user
     # 保存の成功をここで扱う。
     flash[:success] = "Tsukutta!へようこそ"
     redirect_to @user
   else
     render 'new'
   end
 end
 
 private
   def user_params
     params.require(:user).permit(:name, :email, :password,
                                  :password_confirmation)
   end
 
end
```
以上です。掲載していないコードなどがありましたらご指摘ください。
よろしくお願いします。
・追記
db/schema.rbの中身はこのようになっています!
```
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20181016133724) do
 create_table "comments", force: :cascade do |t|
   t.integer "post_id"
   t.string  "name",      null: false
   t.text    "comment",   null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_comments_on_post_id"
 end
 create_table "favorites", force: :cascade do |t|
   t.integer "user_id",   null: false
   t.integer "post_id",   null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_favorites_on_post_id"
   t.index ["user_id"], name: "index_favorites_on_user_id"
 end
 create_table "post_tag_relations", force: :cascade do |t|
   t.integer "post_id"
   t.integer "tag_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_post_tag_relations_on_post_id"
   t.index ["tag_id"], name: "index_post_tag_relations_on_tag_id"
 end
 create_table "posts", force: :cascade do |t|
   t.string  "name"
   t.string  "title"
   t.text    "content"
   t.integer "user_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.string  "picture"
   t.index ["user_id", "created_at"], name: "index_posts_on_user_id_and_created_at"
   t.index ["user_id"], name: "index_posts_on_user_id"
 end
 create_table "tags", force: :cascade do |t|
   t.string  "name",      null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
 end
 create_table "users", force: :cascade do |t|
   t.string  "name"
   t.string  "email"
   t.datetime "created_at",     null: false
   t.datetime "updated_at",     null: false
   t.string  "password_digest"
   t.string  "remember_digest"
   t.index ["email"], name: "index_users_on_email", unique: true
 end
end
```
・Gemfileを追加。bcryptがあることを確認しました。
```
source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.0.0', '>= 5.0.0.1'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use Puma as the app server
gem 'puma', '~> 3.0'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
group :development, :test do
 gem 'rspec-rails', '3.1.0'
 # Call 'byebug' anywhere in the code to stop execution and get a debugger console
 gem 'byebug', platform: :mri
 # 追加
 gem 'rails-flog', require: 'flog'
end
group :development do
 # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
 gem 'web-console'
 gem 'listen', '~> 3.0.5'
 # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
 gem 'spring'
 gem 'spring-watcher-listen', '~> 2.0.0'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
gem 'bootstrap-sass', '3.3.7'
gem 'data-confirm-modal'
gem 'kaminari'
gem 'rails-i18n'
gem 'annotate'
gem 'rake', '< 11.0'
gem 'carrierwave'
gem 'bcrypt',        '3.1.12'
gem 'font-awesome-rails'
```
・users/new.html.erbを追加しました!!
```
<% provide(:title, 'Sign up') %>
<h1>無料会員登録</h1>
<div class="row">
 <div class="col-md-6 col-md-offset-3">
   <%= form_for(@user, url: signup_path) do |f| %>
     <%= render 'shared/error_messages' %>
     <%= f.label :name %>
     <%= f.text_field :name, class: 'form-control' %>
     <%= f.label :email %>
     <%= f.email_field :email, class: 'form-control' %>
     <%= f.label :password %>
     <%= f.password_field :password, class: 'form-control' %>
     <%= f.label :password_confirmation, "Confirmation" %>
     <%= f.password_field :password_confirmation, class: 'form-control' %>
     <%= f.submit "アカウントを作成する", class: "btn btn-primary" %>
   <% end %>
 </div>
</div>
```
新規登録後、戻されるページのURLは以下のとおりです。登録前と変わらないところに戻されます!
https://b1fcca702fd243a2b259db29bd0cfdd6.vfs.cloud9.ap-southeast-1.amazonaws.com/signup
https://b1fcca702fd243a2b259db29bd0cfdd6.vfs.cloud9.ap-southeast-1.amazonaws.com/signup
・routes.rbを追加します!
```
Rails.application.routes.draw do
 get 'sessions/new'
 get 'static_pages/home'
 get '/about',  to: 'static_pages#about'
 get '/contact', to: 'static_pages#contact'
 get '/signup', to: 'users#new'
 post '/signup', to: 'users#create'
 resources :users
 get   '/login',  to: 'sessions#new'
 
 post  '/login',  to: 'sessions#create'
 delete '/logout', to: 'sessions#destroy'
 get 'comments/create'
 get 'comments/destroy'
 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
 root 'static_pages#home'
 
 resources :favorites, only: %i[create destroy]
 resources :comments, only: %i[create destroy]
 
 resources :posts
end
```
  • Ruby

    11742 questions

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

  • Ruby on Rails

    11369 questions

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

4 質問事項に対して回答を追加

ayachika

ayachika score 34

2018/11/01 18:18  投稿

新規ユーザー登録しようとするとパスワード入力後空になって登録ページに戻ってしまう問題について
railsチュートリアルに沿ってアプリを学習中のrails歴4ヶ月の初心者です。
ログイン機能について実装し、正常に動いていたのですが、チュートリアル13章の「ユーザ情報についてデータベースをリセットする。」という指示のあと、ログインできないため(ユーザがいないため)、新規でユーザーを登録しようとしたところ、新規ユーザー登録のための氏名、email、パスワードを入力すると、ページ遷移せずに、そのままパスワードの欄が空になり元の新規登録のページに戻ってしまうというエラー?が発生しています。
新規登録にあたるコードはいじっていないですし、railsチュートリアルに戻ってコードの確認をしてもコードに変更はないため、なぜこうなるのかわかりません。
エラー画面も、新規登録時のフラッシュ(パスワードが抜けています等)は一切発生していません。
以下にコードを記載します。
どなたか、似たような現象に遭遇した方、解決方法についてご助言いただける方教えていただけると幸いです。
・ユーザーモデル
```userモデル
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :name
     t.string :email
     t.timestamps
   end
 end
end
```
・user.rb
```user.rb
# == Schema Information
#
# Table name: users
#
# id             :integer         not null, primary key
# email          :string
# name           :string
# password_digest :string
# remember_digest :string
# created_at     :datetime        not null
# updated_at     :datetime        not null
#
# Indexes
#
# index_users_on_email (email) UNIQUE
#
class User < ApplicationRecord
   has_many:posts
   before_save { email.downcase! }
   validates :name, presence: true, length: { maximum: 50 }
   VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
   validates :email, presence: true, length: { maximum: 255 },
                           format: { with: VALID_EMAIL_REGEX },
                           uniqueness: { case_sensitive: false }
   has_secure_password
   validates :password, presence: true, length: { minimum: 6 }
   # 渡された文字列のハッシュ値を返す
 def self.digest(string)
   cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                 BCrypt::Engine.cost
   BCrypt::Password.create(string, cost: cost)
 end
# ランダムなトークンを返す
 def self.new_token
   SecureRandom.urlsafe_base64
 end
# 永続セッションのためにユーザーをデータベースに記憶する
 def remember
   self.remember_token = User.new_token
   update_attribute(:remember_digest, User.digest(remember_token))
 end
# 渡されたトークンがダイジェストと一致したらtrueを返す
 def authenticated?(remember_token)
   return false if remember_digest.nil?
   BCrypt::Password.new(remember_digest).is_password?(remember_token)
 end
 # ユーザーのログイン情報を破棄する
 def forget
   update_attribute(:remember_digest, nil)
 end
 belongs_to :user
 
 #favorite機能をつけた時に追加
 has_many :favorites, through: :favorites, source: :post, dependent: :destroy
 has_many :posts, through: :favorites
 has_many :posts, dependent: :destroy
end
```
・users_controller.rb
```ここに言語を入力
class UsersController < ApplicationController
 def show
   @user = User.find(params[:id])
   @user = User.find(params[:id])
   @posts = @user.posts.paginate(page: params[:page])
   # モデルクラスのwhereメソッドへ検索カラムと値を渡すと合致するモデルを配列形式で返却
   #@posts = Post.where(:user_id, @user.id)
 end
 def new
   @user = User.new
 end
 
 def create
   @user = User.new(user_params) 
   if @user.save
     log_in @user
     # 保存の成功をここで扱う。
     flash[:success] = "Tsukutta!へようこそ"
     redirect_to @user
   else
     render 'new'
   end
 end
 
 private
   def user_params
     params.require(:user).permit(:name, :email, :password,
                                  :password_confirmation)
   end
 
end
```
以上です。掲載していないコードなどがありましたらご指摘ください。
よろしくお願いします。
・追記
db/schema.rbの中身はこのようになっています!
```
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20181016133724) do
 create_table "comments", force: :cascade do |t|
   t.integer "post_id"
   t.string  "name",      null: false
   t.text    "comment",   null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_comments_on_post_id"
 end
 create_table "favorites", force: :cascade do |t|
   t.integer "user_id",   null: false
   t.integer "post_id",   null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_favorites_on_post_id"
   t.index ["user_id"], name: "index_favorites_on_user_id"
 end
 create_table "post_tag_relations", force: :cascade do |t|
   t.integer "post_id"
   t.integer "tag_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_post_tag_relations_on_post_id"
   t.index ["tag_id"], name: "index_post_tag_relations_on_tag_id"
 end
 create_table "posts", force: :cascade do |t|
   t.string  "name"
   t.string  "title"
   t.text    "content"
   t.integer "user_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.string  "picture"
   t.index ["user_id", "created_at"], name: "index_posts_on_user_id_and_created_at"
   t.index ["user_id"], name: "index_posts_on_user_id"
 end
 create_table "tags", force: :cascade do |t|
   t.string  "name",      null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
 end
 create_table "users", force: :cascade do |t|
   t.string  "name"
   t.string  "email"
   t.datetime "created_at",     null: false
   t.datetime "updated_at",     null: false
   t.string  "password_digest"
   t.string  "remember_digest"
   t.index ["email"], name: "index_users_on_email", unique: true
 end
end
```
・Gemfileを追加。bcryptがあることを確認しました。
```
source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.0.0', '>= 5.0.0.1'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use Puma as the app server
gem 'puma', '~> 3.0'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
group :development, :test do
 gem 'rspec-rails', '3.1.0'
 # Call 'byebug' anywhere in the code to stop execution and get a debugger console
 gem 'byebug', platform: :mri
 # 追加
 gem 'rails-flog', require: 'flog'
end
group :development do
 # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
 gem 'web-console'
 gem 'listen', '~> 3.0.5'
 # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
 gem 'spring'
 gem 'spring-watcher-listen', '~> 2.0.0'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
gem 'bootstrap-sass', '3.3.7'
gem 'data-confirm-modal'
gem 'kaminari'
gem 'rails-i18n'
gem 'annotate'
gem 'rake', '< 11.0'
gem 'carrierwave'
gem 'bcrypt',        '3.1.12'
gem 'font-awesome-rails'
```
```
・users/new.html.erbを追加しました!!
```
<% provide(:title, 'Sign up') %>
<h1>無料会員登録</h1>
<div class="row">
 <div class="col-md-6 col-md-offset-3">
   <%= form_for(@user, url: signup_path) do |f| %>
     <%= render 'shared/error_messages' %>
     <%= f.label :name %>
     <%= f.text_field :name, class: 'form-control' %>
     <%= f.label :email %>
     <%= f.email_field :email, class: 'form-control' %>
     <%= f.label :password %>
     <%= f.password_field :password, class: 'form-control' %>
     <%= f.label :password_confirmation, "Confirmation" %>
     <%= f.password_field :password_confirmation, class: 'form-control' %>
     <%= f.submit "アカウントを作成する", class: "btn btn-primary" %>
   <% end %>
 </div>
</div>
```
新規登録後、戻されるページのURLは以下のとおりです。登録前と変わらないところに戻されます!
https://b1fcca702fd243a2b259db29bd0cfdd6.vfs.cloud9.ap-southeast-1.amazonaws.com/signup
  • Ruby

    11742 questions

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

  • Ruby on Rails

    11369 questions

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

3 Gemfileの中身について記載

ayachika

ayachika score 34

2018/10/31 18:11  投稿

新規ユーザー登録しようとするとパスワード入力後空になって登録ページに戻ってしまう問題について
railsチュートリアルに沿ってアプリを学習中のrails歴4ヶ月の初心者です。
ログイン機能について実装し、正常に動いていたのですが、チュートリアル13章の「ユーザ情報についてデータベースをリセットする。」という指示のあと、ログインできないため(ユーザがいないため)、新規でユーザーを登録しようとしたところ、新規ユーザー登録のための氏名、email、パスワードを入力すると、ページ遷移せずに、そのままパスワードの欄が空になり元の新規登録のページに戻ってしまうというエラー?が発生しています。
新規登録にあたるコードはいじっていないですし、railsチュートリアルに戻ってコードの確認をしてもコードに変更はないため、なぜこうなるのかわかりません。
エラー画面も、新規登録時のフラッシュ(パスワードが抜けています等)は一切発生していません。
以下にコードを記載します。
どなたか、似たような現象に遭遇した方、解決方法についてご助言いただける方教えていただけると幸いです。
・ユーザーモデル
```userモデル
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :name
     t.string :email
     t.timestamps
   end
 end
end
```
・user.rb
```user.rb
# == Schema Information
#
# Table name: users
#
# id             :integer         not null, primary key
# email          :string
# name           :string
# password_digest :string
# remember_digest :string
# created_at     :datetime        not null
# updated_at     :datetime        not null
#
# Indexes
#
# index_users_on_email (email) UNIQUE
#
class User < ApplicationRecord
   has_many:posts
   before_save { email.downcase! }
   validates :name, presence: true, length: { maximum: 50 }
   VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
   validates :email, presence: true, length: { maximum: 255 },
                           format: { with: VALID_EMAIL_REGEX },
                           uniqueness: { case_sensitive: false }
   has_secure_password
   validates :password, presence: true, length: { minimum: 6 }
   # 渡された文字列のハッシュ値を返す
 def self.digest(string)
   cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                 BCrypt::Engine.cost
   BCrypt::Password.create(string, cost: cost)
 end
# ランダムなトークンを返す
 def self.new_token
   SecureRandom.urlsafe_base64
 end
# 永続セッションのためにユーザーをデータベースに記憶する
 def remember
   self.remember_token = User.new_token
   update_attribute(:remember_digest, User.digest(remember_token))
 end
# 渡されたトークンがダイジェストと一致したらtrueを返す
 def authenticated?(remember_token)
   return false if remember_digest.nil?
   BCrypt::Password.new(remember_digest).is_password?(remember_token)
 end
 # ユーザーのログイン情報を破棄する
 def forget
   update_attribute(:remember_digest, nil)
 end
 belongs_to :user
 
 #favorite機能をつけた時に追加
 has_many :favorites, through: :favorites, source: :post, dependent: :destroy
 has_many :posts, through: :favorites
 has_many :posts, dependent: :destroy
end
```
・users_controller.rb
```ここに言語を入力
class UsersController < ApplicationController
 def show
   @user = User.find(params[:id])
   @user = User.find(params[:id])
   @posts = @user.posts.paginate(page: params[:page])
   # モデルクラスのwhereメソッドへ検索カラムと値を渡すと合致するモデルを配列形式で返却
   #@posts = Post.where(:user_id, @user.id)
 end
 def new
   @user = User.new
 end
 
 def create
   @user = User.new(user_params) 
   if @user.save
     log_in @user
     # 保存の成功をここで扱う。
     flash[:success] = "Tsukutta!へようこそ"
     redirect_to @user
   else
     render 'new'
   end
 end
 
 private
   def user_params
     params.require(:user).permit(:name, :email, :password,
                                  :password_confirmation)
   end
 
end
```
以上です。掲載していないコードなどがありましたらご指摘ください。
よろしくお願いします。
・追記
db/schema.rbの中身はこのようになっています!
```
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20181016133724) do
 create_table "comments", force: :cascade do |t|
   t.integer "post_id"
   t.string  "name",      null: false
   t.text    "comment",   null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_comments_on_post_id"
 end
 create_table "favorites", force: :cascade do |t|
   t.integer "user_id",   null: false
   t.integer "post_id",   null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_favorites_on_post_id"
   t.index ["user_id"], name: "index_favorites_on_user_id"
 end
 create_table "post_tag_relations", force: :cascade do |t|
   t.integer "post_id"
   t.integer "tag_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_post_tag_relations_on_post_id"
   t.index ["tag_id"], name: "index_post_tag_relations_on_tag_id"
 end
 create_table "posts", force: :cascade do |t|
   t.string  "name"
   t.string  "title"
   t.text    "content"
   t.integer "user_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.string  "picture"
   t.index ["user_id", "created_at"], name: "index_posts_on_user_id_and_created_at"
   t.index ["user_id"], name: "index_posts_on_user_id"
 end
 create_table "tags", force: :cascade do |t|
   t.string  "name",      null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
 end
 create_table "users", force: :cascade do |t|
   t.string  "name"
   t.string  "email"
   t.datetime "created_at",     null: false
   t.datetime "updated_at",     null: false
   t.string  "password_digest"
   t.string  "remember_digest"
   t.index ["email"], name: "index_users_on_email", unique: true
 end
end
```  
 
・Gemfileを追加。bcryptがあることを確認しました。  
```  
source 'https://rubygems.org'  
 
 
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'  
gem 'rails', '~> 5.0.0', '>= 5.0.0.1'  
# Use sqlite3 as the database for Active Record  
gem 'sqlite3'  
# Use Puma as the app server  
gem 'puma', '~> 3.0'  
# Use SCSS for stylesheets  
gem 'sass-rails', '~> 5.0'  
# Use Uglifier as compressor for JavaScript assets  
gem 'uglifier', '>= 1.3.0'  
# Use CoffeeScript for .coffee assets and views  
gem 'coffee-rails', '~> 4.2'  
# See https://github.com/rails/execjs#readme for more supported runtimes  
# gem 'therubyracer', platforms: :ruby  
 
# Use jquery as the JavaScript library  
gem 'jquery-rails'  
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks  
gem 'turbolinks', '~> 5'  
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder  
gem 'jbuilder', '~> 2.5'  
# Use Redis adapter to run Action Cable in production  
# gem 'redis', '~> 3.0'  
# Use ActiveModel has_secure_password  
# gem 'bcrypt', '~> 3.1.7'  
 
# Use Capistrano for deployment  
# gem 'capistrano-rails', group: :development  
 
group :development, :test do  
 gem 'rspec-rails', '3.1.0'  
 # Call 'byebug' anywhere in the code to stop execution and get a debugger console  
 gem 'byebug', platform: :mri  
 # 追加  
 gem 'rails-flog', require: 'flog'  
end  
 
group :development do  
 # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.  
 gem 'web-console'  
 gem 'listen', '~> 3.0.5'  
 # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring  
 gem 'spring'  
 gem 'spring-watcher-listen', '~> 2.0.0'  
end  
 
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem  
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]  
 
gem 'bootstrap-sass', '3.3.7'  
gem 'data-confirm-modal'  
gem 'kaminari'  
gem 'rails-i18n'  
gem 'annotate'  
gem 'rake', '< 11.0'  
gem 'carrierwave'  
gem 'bcrypt',        '3.1.12'  
gem 'font-awesome-rails'  
```
  • Ruby

    11742 questions

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

  • Ruby on Rails

    11369 questions

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

2 db/schema.rbの中身を追加

ayachika

ayachika score 34

2018/10/31 07:48  投稿

新規ユーザー登録しようとするとパスワード入力後空になって登録ページに戻ってしまう問題について
railsチュートリアルに沿ってアプリを学習中のrails歴4ヶ月の初心者です。
ログイン機能について実装し、正常に動いていたのですが、チュートリアル13章の「ユーザ情報についてデータベースをリセットする。」という指示のあと、ログインできないため(ユーザがいないため)、新規でユーザーを登録しようとしたところ、新規ユーザー登録のための氏名、email、パスワードを入力すると、ページ遷移せずに、そのままパスワードの欄が空になり元の新規登録のページに戻ってしまうというエラー?が発生しています。
新規登録にあたるコードはいじっていないですし、railsチュートリアルに戻ってコードの確認をしてもコードに変更はないため、なぜこうなるのかわかりません。
エラー画面も、新規登録時のフラッシュ(パスワードが抜けています等)は一切発生していません。
以下にコードを記載します。
どなたか、似たような現象に遭遇した方、解決方法についてご助言いただける方教えていただけると幸いです。
・ユーザーモデル
```userモデル
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :name
     t.string :email
     t.timestamps
   end
 end
end
```
・user.rb
```user.rb
# == Schema Information
#
# Table name: users
#
# id             :integer         not null, primary key
# email          :string
# name           :string
# password_digest :string
# remember_digest :string
# created_at     :datetime        not null
# updated_at     :datetime        not null
#
# Indexes
#
# index_users_on_email (email) UNIQUE
#
class User < ApplicationRecord
   has_many:posts
   before_save { email.downcase! }
   validates :name, presence: true, length: { maximum: 50 }
   VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
   validates :email, presence: true, length: { maximum: 255 },
                           format: { with: VALID_EMAIL_REGEX },
                           uniqueness: { case_sensitive: false }
   has_secure_password
   validates :password, presence: true, length: { minimum: 6 }
   # 渡された文字列のハッシュ値を返す
 def self.digest(string)
   cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                 BCrypt::Engine.cost
   BCrypt::Password.create(string, cost: cost)
 end
# ランダムなトークンを返す
 def self.new_token
   SecureRandom.urlsafe_base64
 end
# 永続セッションのためにユーザーをデータベースに記憶する
 def remember
   self.remember_token = User.new_token
   update_attribute(:remember_digest, User.digest(remember_token))
 end
# 渡されたトークンがダイジェストと一致したらtrueを返す
 def authenticated?(remember_token)
   return false if remember_digest.nil?
   BCrypt::Password.new(remember_digest).is_password?(remember_token)
 end
 # ユーザーのログイン情報を破棄する
 def forget
   update_attribute(:remember_digest, nil)
 end
 belongs_to :user
 
 #favorite機能をつけた時に追加
 has_many :favorites, through: :favorites, source: :post, dependent: :destroy
 has_many :posts, through: :favorites
 has_many :posts, dependent: :destroy
end
```
・users_controller.rb
```ここに言語を入力
class UsersController < ApplicationController
 def show
   @user = User.find(params[:id])
   @user = User.find(params[:id])
   @posts = @user.posts.paginate(page: params[:page])
   # モデルクラスのwhereメソッドへ検索カラムと値を渡すと合致するモデルを配列形式で返却
   #@posts = Post.where(:user_id, @user.id)
 end
 def new
   @user = User.new
 end
 
 def create
   @user = User.new(user_params) 
   if @user.save
     log_in @user
     # 保存の成功をここで扱う。
     flash[:success] = "Tsukutta!へようこそ"
     redirect_to @user
   else
     render 'new'
   end
 end
 
 private
   def user_params
     params.require(:user).permit(:name, :email, :password,
                                  :password_confirmation)
   end
 
end
```
以上です。掲載していないコードなどがありましたらご指摘ください。
よろしくお願いします。
よろしくお願いします。
・追記
db/schema.rbの中身はこのようになっています!
```
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20181016133724) do
 create_table "comments", force: :cascade do |t|
   t.integer "post_id"
   t.string  "name",      null: false
   t.text    "comment",   null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_comments_on_post_id"
 end
 create_table "favorites", force: :cascade do |t|
   t.integer "user_id",   null: false
   t.integer "post_id",   null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_favorites_on_post_id"
   t.index ["user_id"], name: "index_favorites_on_user_id"
 end
 create_table "post_tag_relations", force: :cascade do |t|
   t.integer "post_id"
   t.integer "tag_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.index ["post_id"], name: "index_post_tag_relations_on_post_id"
   t.index ["tag_id"], name: "index_post_tag_relations_on_tag_id"
 end
 create_table "posts", force: :cascade do |t|
   t.string  "name"
   t.string  "title"
   t.text    "content"
   t.integer "user_id"
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
   t.string  "picture"
   t.index ["user_id", "created_at"], name: "index_posts_on_user_id_and_created_at"
   t.index ["user_id"], name: "index_posts_on_user_id"
 end
 create_table "tags", force: :cascade do |t|
   t.string  "name",      null: false
   t.datetime "created_at", null: false
   t.datetime "updated_at", null: false
 end
 create_table "users", force: :cascade do |t|
   t.string  "name"
   t.string  "email"
   t.datetime "created_at",     null: false
   t.datetime "updated_at",     null: false
   t.string  "password_digest"
   t.string  "remember_digest"
   t.index ["email"], name: "index_users_on_email", unique: true
 end
end
```
  • Ruby

    11742 questions

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

  • Ruby on Rails

    11369 questions

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

1 タイトルをわかりやすく変更

ayachika

ayachika score 34

2018/10/30 06:44  投稿

railsのアプリにおいて新規登録パスワード入力後空になって登録ページに戻ってしまう
新規ユーザー登録しようとするとパスワード入力後空になって登録ページに戻ってしまう問題について
railsチュートリアルに沿ってアプリを学習中のrails歴4ヶ月の初心者です。
ログイン機能について実装し、正常に動いていたのですが、チュートリアル13章の「ユーザ情報についてデータベースをリセットする。」という指示のあと、ログインできないため(ユーザがいないため)、新規でユーザーを登録しようとしたところ、新規ユーザー登録のための氏名、email、パスワードを入力すると、ページ遷移せずに、そのままパスワードの欄が空になり元の新規登録のページに戻ってしまうというエラー?が発生しています。
新規登録にあたるコードはいじっていないですし、railsチュートリアルに戻ってコードの確認をしてもコードに変更はないため、なぜこうなるのかわかりません。
エラー画面も、新規登録時のフラッシュ(パスワードが抜けています等)は一切発生していません。
以下にコードを記載します。
どなたか、似たような現象に遭遇した方、解決方法についてご助言いただける方教えていただけると幸いです。
・ユーザーモデル
```userモデル
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps
end
end
end
```
・user.rb
```user.rb
# == Schema Information
#
# Table name: users
#
# id :integer not null, primary key
# email :string
# name :string
# password_digest :string
# remember_digest :string
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_users_on_email (email) UNIQUE
#
class User < ApplicationRecord
has_many:posts
before_save { email.downcase! }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
has_secure_password
validates :password, presence: true, length: { minimum: 6 }
# 渡された文字列のハッシュ値を返す
def self.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
# ランダムなトークンを返す
def self.new_token
SecureRandom.urlsafe_base64
end
# 永続セッションのためにユーザーをデータベースに記憶する
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
# 渡されたトークンがダイジェストと一致したらtrueを返す
def authenticated?(remember_token)
return false if remember_digest.nil?
BCrypt::Password.new(remember_digest).is_password?(remember_token)
end
# ユーザーのログイン情報を破棄する
def forget
update_attribute(:remember_digest, nil)
end
belongs_to :user
#favorite機能をつけた時に追加
has_many :favorites, through: :favorites, source: :post, dependent: :destroy
has_many :posts, through: :favorites
has_many :posts, dependent: :destroy
end
```
・users_controller.rb
```ここに言語を入力
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
@user = User.find(params[:id])
@posts = @user.posts.paginate(page: params[:page])
# モデルクラスのwhereメソッドへ検索カラムと値を渡すと合致するモデルを配列形式で返却
#@posts = Post.where(:user_id, @user.id)
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
# 保存の成功をここで扱う。
flash[:success] = "Tsukutta!へようこそ"
redirect_to @user
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation)
end
end
```
以上です。掲載していないコードなどがありましたらご指摘ください。
よろしくお願いします。
  • Ruby

    11742 questions

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

  • Ruby on Rails

    11369 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る