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

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

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

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

Ruby

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

Q&A

解決済

1回答

6139閲覧

Routing Error uninitialized constant RelationshipsControllerが表示される。

xk2ykx

総合スコア11

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/09/12 12:21

編集2018/09/12 12:28

タイトルの通りです。
Rails tutorial14章のリスト14.4まで行き、動作確認のため他ユーザーの「Follow」ボタンを押した途端に以下の画面が表示され、当該エラー文で検索をしてみましたが、どれも「初期化する」や、「タチの悪いエラー」と出たり、同じような質問にも回答がなかったりと、根本的な解決策と原因が見当たりません。

イメージ説明

どのソースコードが悪さをしているか全くわからないため、以下にいくつかコードを挿入しておきます。
ちなみに、エラー文に表示されている「RelationshipsController」は作成しておりません。

使用OS : mac OS High Sierra 10.13.3
開発環境 : cloud9

また、必要な箇所があればその都度追記いたしますので、よろしくお願いいたします。

config/routes.rb

Ruby

1Rails.application.routes.draw do 2 root 'static_pages#home' 3 get 'help' => 'static_pages#help' 4 get 'about' => 'static_pages#about' 5 get 'contact' => 'static_pages#contact' 6 get 'signup' => 'users#new' 7 get 'login' => 'sessions#new' 8 post 'login' => 'sessions#create' 9 delete 'logout' => 'sessions#destroy' 10 resources :users do 11 member do 12 get :following, :followers 13 end 14 end 15 resources :account_activations, only: [:edit] 16 resources :password_resets, only: [:new, :create, :edit, :update] 17 resources :microposts, only: [:create, :destroy] 18 resources :relationships, only: [:create, :destroy] 19end

controller/users_controller.rb

Ruby

1class UsersController < ApplicationController 2 before_action :logged_in_user, only: [:index, :edit , :update , :destroy] 3 before_action :correct_user, only: [:edit , :update] 4 before_action :admin_user, only: :destroy 5 6 def index 7 @users = User.where(activated: true).paginate(page: params[:page]) 8 end 9 10 # GET /users/:id 11 def show 12 @user = User.find(params[:id]) 13 @microposts = @user.microposts.paginate(page: params[:page]) 14 end 15 16 def new 17 @user = User.new 18 end 19 20 # POST /users 21 def create 22 @user = User.new(user_params) 23 if @user.save # => Validation 24 @user.send_activation_email 25 flash[:info] = "Please check your email to active your account" 26 redirect_to root_url 27 else 28 # Failure 29 render 'new' 30 end 31 end 32 33 def edit 34 @user = User.find(params[:id]) 35 end 36 37 def update 38 @user = User.find(params[:id]) 39 if @user.update_attributes(user_params) 40 #更新に成功 41 flash[:success] = "Profile Updated" 42 redirect_to @user 43 else 44 render 'edit' 45 end 46 end 47 48 def destroy 49 User.find(params[:id]).destroy 50 flash[:success] = "User deleted" 51 redirect_to users_url 52 end 53 54 private 55 56 def user_params 57 params.require(:user).permit( 58 :name, :email, :password, 59 :password_confirmation) 60 end 61 62 # 正しいユーザーかどうか確認 63 def correct_user 64 # GET /users/:id/edit 65 # PATCH /users/:id 66 @user = User.find(params[:id]) 67 redirect_to(root_url) unless current_user?(@user) 68 end 69 70 def admin_user 71 redirect_to(root_url) unless current_user.admin? 72 end 73 74end

models/user.rb

Ruby

1class User < ApplicationRecord 2 has_many :microposts, dependent: :destroy 3 has_many :active_relationships, class_name: "Relationship", 4 foreign_key: "follower_id", 5 dependent: :destroy 6 has_many :passive_relationships, class_name: "Relationship", 7 foreign_key: "followed_id", 8 dependent: :destroy 9 has_many :following, through: :active_relationships, source: :followed 10 has_many :followers, through: :passive_relationships, source: :follower 11 12 attr_accessor :remember_token, :activation_token, :reset_token 13 before_save :downcase_email 14 before_create :create_activation_digest 15 validates :name, presence: true, length: { maximum: 50 } 16 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i 17 validates :email, presence: true, length: { maximum: 255 }, 18 format: { with: VALID_EMAIL_REGEX }, 19 uniqueness: { case_sensitive: false } 20 has_secure_password 21 validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 22 23 def User.digest(string) 24 cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 25 BCrypt::Engine.cost 26 BCrypt::Password.create(string, cost: cost) 27 end 28 29 def User.new_token 30 SecureRandom.urlsafe_base64 31 end 32 33 def remember 34 self.remember_token = User.new_token 35 self.update_attribute(:remember_digest, 36 User.digest(remember_token)) 37 end 38 39 def forget 40 self.update_attribute(:remember_digest, nil) 41 end 42 43 # 渡されたトークンがダイジェストと一致したらtrueを返す 44 def authenticated?(remember_token) 45 return false if remember_digest.nil? 46 BCrypt::Password.new(self.remember_digest).is_password?(remember_token) 47 end 48 49 # トークンがダイジェストと一致したらtrueを返す 50 def authenticated?(attribute, token) 51 digest = send("#{attribute}_digest") 52 return false if digest.nil? 53 BCrypt::Password.new(digest).is_password?(token) 54 end 55 56 #アカウントを有効にする 57 def active 58 update_attribute(:activated, true ) 59 update_attribute(:activated_at, Time.zone.now) 60 end 61 62 #有効化用のメールを送信する 63 def send_activation_email 64 UserMailer.account_activation(self).deliver_now 65 end 66 67 #パスワード再設定の属性を設定する 68 def create_reset_digest 69 self.reset_token = User.new_token 70 update_columns(reset_digest: User.digest(reset_token), reset_sent_at: Time.zone.now) 71 end 72 73 #パスワード再設定のメールを送信する 74 def send_password_reset_email 75 UserMailer.password_reset(self).deliver_now 76 end 77 78 #パスワード再設定の期限が切れている場合はtrueを返す 79 def password_reset_expired? 80 reset_sent_at < 2.hours.ago 81 end 82 83 def feed 84 Micropost.where("user_id = ?", id) 85 end 86 87 def follow(other_user) 88 following << other_user 89 end 90 91 def unfollow(other_user) 92 active_relationships.find_by(followed_id: other_user.id).destroy 93 end 94 95 def following?(other_user) 96 following.include?(other_user) 97 end 98 99 100 private 101 102 # メールアドレスをすべて小文字にする 103 def downcase_email 104 self.email = email.downcase 105 end 106 107 # 有効化トークンとダイジェストを作成および代入する 108 def create_activation_digest 109 self.activation_token = User.new_token 110 self.activation_digest = User.digest(activation_token) 111 end 112 113end

models/relationship.rb

Ruby

1class Relationship < ApplicationRecord 2 belongs_to :follower, class_name: "User" 3 belongs_to :followed, class_name: "User" 4 validates :follower_id, presence: true 5 validates :followed_id, presence: true 6end 7

db/seeds.rb

Ruby

1# ユーザー 2User.create!(name: "Example User", 3 email: "example@railstutorial.org", 4 password: "foobar", 5 password_confirmation: "foobar", 6 admin: true, 7 activated: true, 8 activated_at: Time.zone.now) 9 1099.times do |n| 11 name = Faker::Name.name 12 email = "example-#{n+1}@railstutorial.org" 13 password = "password" 14 User.create!(name: name, 15 email: email, 16 password: password, 17 password_confirmation: password, 18 activated: true, 19 activated_at: Time.zone.now) 20end 21 22# マイクロポスト 23users = User.order(:created_at).take(6) 2450.times do 25 content = Faker::Lorem.sentence(5) 26 users.each { |user| user.microposts.create!(content: content) } 27end 28# リレーションシップ 29users = User.all 30user = users.first 31following = users[2..50] 32followers = users[3..40] 33following.each { |followed| user.follow(followed) } 34followers.each { |follower| follower.follow(user) }

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

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

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

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

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

guest

回答1

0

自己解決

routes.rbにて、

Ruby

1 resources :relationships, only: [:create, :destroy]

という記述があるが、
relationships_controller.rbと、その中にcreateとdestroyメソッドがないために以上のエラーが出たことを予測できたため、rails gで生成したらエラーが解消されました。

ただ、「Followボタンを押してみましょう」という流れの次の段階で

Ruby

1Rails g controller relationships_controller

を入力する流れになっているので、なぜ自分が「Followボタン」を押した段階で以上のようなルーティングエラーが出たのか、原因がわかりません。

投稿2018/09/12 12:44

xk2ykx

総合スコア11

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

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

meb4427

2022/02/20 08:40

同じ症状に陥っている事例で助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問