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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Ruby on Rails

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

641閲覧

ネストをしたルーティングで、コントローラでのidの取り出し方について。

kinpin

総合スコア4

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Ruby on Rails

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2020/08/28 12:36

rails 6.0.0
ruby '2.6.5'

ルーティングのネストを行ったにですが、ルーティングのidがうまく取り出せないです。
現在、http://localhost:3000/users/id/としたいです。
ですかhttp://localhost:3000/usersでエラーになります。

NameError in UsersController#index
undefined local variable or method `id' for #

@userのid が取り出せてないのでコントローラーの記述がおかしいのかとは思います。
試行錯誤してみましたがうまくいかないので、どなたかアドバイス、いただけないでしょうか?
ビューの記述の仕方もあってますか?

routes.rb

1 2Rails.application.routes.draw do 3 devise_for :doctors, controllers: { 4 sessions: 'doctors/sessions', 5 passwords: 'doctors/passwords', 6 registrations: 'doctors/registrations' 7 } 8 devise_for :users, controllers: { 9 sessions: 'users/sessions', 10 passwords: 'users/passwords', 11 registrations: 'users/registrations' 12 } 13 14 resources :doctors, only: [:index, :show] 15 root to: 'healths#index' 16 17 resources :users do 18 resources :medicines, only: [:create, :new, :index] 19 end 20end 21
class UsersController < ApplicationController def index @user = User.find(params[id]) end def new @user = User.new end def create @user = User.create(user_params) if @user.save reder :show else render 'new' end end def show @user = User.find(params[:id]) end private def user_params params.require(:user).permit(:nickname, :email, :password, :gender_id, :birth, :bloodtype_id, :emergencyperson, :emergencycall) end end
<div class="user-access"> <div class="user-nav"> <%= image_tag "remote.jpg", class:"main-pict" %> <% if user_signed_in? && current_user.id %> <div class="btn-icon-nav"> <%= link_to destroy_user_session_path, method: :delete do %> <div class="btn-icon"> <p>ログアウト</p> </div> <% end %> <%= link_to new_user_medicine_path(@user.id), class: "post" do %> <div class="btn-icon"> <p>投稿する</p> </div> <% end %> </div> <% else %> <div class="btn-icon-nav"> <%= link_to new_user_session_path do %> <div class="btn-icon"> <p>ログイン</p> </div> <% end %> <%= link_to new_user_registration_path do %> <div class="btn-icon"> <p>新規会員登録</p> </div> <% end %> </div> <% end %> </div> </div>
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :medicines extend ActiveHash::Associations::ActiveRecordExtensions belongs_to_active_hash :gender belongs_to_active_hash :bloodtype with_options presence: true do validates :nickname validates :email, uniqueness: { case_sensitive: true }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i } validates :password, length: { minimum: 6 }, format: { with: /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i} validates :gender_id, numericality: { other_than: 0 } validates :birth validates :bloodtype_id, numericality: { other_than: 0 } validates :emergencyperson validates :emergencycall end end

class Medicine < ApplicationRecord
belongs_to :user
end

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

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

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

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

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

guest

回答2

0

ベストアンサー

def index で @user = User.find(params[id]) というのが??ではありますが,この部分でのエラーは @user = User.find(params[:id])で治ります。
でも多分 find(nil) になるので同じ場所で別のエラーになりますね。

indexで何をしたいのでしょう?載っているviewはindex?。
見た感じは medicine の new みたいに見えます。

通常は Userのindexではuserの一覧を載せますのでその場合はno1knowsさんの書かれた @users = User.all です。

投稿2020/08/29 00:11

winterboum

総合スコア23567

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

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

kinpin

2020/08/29 03:13

ログインした時にログインしたuserの薬の一覧表示をさせたいのです。その画面から薬の新規登録をしていくボタンも作りたいです。 if文の分岐でログインしてる時としてない時のビューをしてみたらいいかなと仮説を立ててます。
guest

0

一般的にはコントローラーはこれで良いと思いますが、うまく行かないようならindex.html.erbも質問に追記ください。

def index @users = User.all end

投稿2020/08/28 12:43

編集2020/08/28 12:50
no1knows

総合スコア3365

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

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

kinpin

2020/08/29 03:15

いつもコメントありがとうございます涙 はい!まずは ``` def index @users = User.all end ``` にしてみました。無事に画面が表示されました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問