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

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

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

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

Q&A

解決済

2回答

2231閲覧

NoMethodError in Users::Configurations#indexのエラーの直し方

culuculu

総合スコア52

Ruby on Rails

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

0グッド

0クリップ

投稿2016/01/22 17:45

編集2016/01/22 22:24

現在複数のWebページでrailsの勉強をしています。
そこでユーザの名前の変更ができる機能とユーザを一覧表示させるのではなく、個人の名前やメールアドレスは個人しか見えないようにしたいと思っています。
現在のエラーは、NoMethodError in Users::Configurations#index
と出ており、undefined method `name' for nil:NilClass
と言われています。

そして、ユーザの一覧表示は出来るのですがこのままでは自分自身以外のユーザの情報や編集、削除もできてしまうので個人の情報しか見えないようにしたいです。自分の書いたコードのコントローラーのindexメソッドであるUser.find_by_id(params[:user_id])にしています。
どのようにすればいいでしょうか?
ご回答お願いします。
以下にソースコードを載せておきます。

edit.html.erb

1<h1>Users::Configurations#edit</h1> 2<p>Find me in app/views/users/configurations/edit.html.erb</p> 3<h1>Editing User</h1> 4 5<%= render 'form' %> 6 7<%= link_to 'Show', @user %> | 8<%= link_to 'Back', users_path %>

index.html.erb

1<h1>Users::Configurations#index</h1> 2<p>Find me in app/views/users/configurations/index.html.erb</p> 3<p id="notice"><%= notice %></p> 4 5<h1>Listing Users</h1> 6 7<table> 8 <thead> 9 <tr> 10 <th>Name</th> 11 </tr> 12 </thead> 13 14 <tbody> 15 <% @user %> 16 <tr> 17 <td><%= @user.name %></td> 18 <td><%= link_to 'Show', @user %></td> 19 <td><%= link_to 'Edit', edit_@user_path(user) %></td> 20 <td><%= link_to 'Destroy', @user, method: :delete, data: { confirm: '本当に退会してもよろしいですか?' } %></td> 21 </tr> 22 </tbody> 23</table> 24

configurations_controller.rb

1class Users::ConfigurationsController < ApplicationController 2before_action :set_user, only: [:show, :edit, :update, :destroy] 3 def index 4 @user = User.find_by_id(params[:user_id]) 5 end 6 7 def edit 8 end 9 10 def new 11 @user = User.new 12 end 13 14 def show 15 end 16 17 def destroy 18 @user.destroy 19 respond_to do |format| 20 format.html { redirect_to users_url, notice: 'User was successfully destroyed.' } 21 format.json { head :no_content } 22 end 23 end 24 25end 26

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

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

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

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

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

guest

回答2

0

自己解決

ブラウザに表示はできたので一応解決したという形で結果を載せます。
以下のコードのように修正すると直りました。

configurations_controller.rb

1class Users::ConfigurationsController < ApplicationController 2 def index 3 @user = User.find_by_id(params[:user_id]) 4 end 5 6 def edit 7 end 8 9 def destroy 10 @user.destroy 11 redirect_to users_path 12 end 13end 14

index.html.erb

1<h1>Users::Configurations#index</h1> 2<p>Find me in app/views/users/configurations/index.html.erb</p> 3 <ul> 4<% @user %> 5 <li> 6 <%= link_to "[Edit]", users_configurations_edit_path %> 7 <%= link_to "[Delete]", users_configurations_destroy_path, method: :delete, data: { 8 confirm: "本当に削除してもよろしいですか?" } %> 9 </li> 10 </ul> 11

ですが、edit.html.erbとdestroy.html.erbがうまく書けていないので動作しませんがブラウザにはうまく表示できました。
回答してくださったyh1126さん。
そして、この課題に取り組んでいただいた方々、ありがとうございました。

投稿2016/01/23 13:59

culuculu

総合スコア52

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

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

0

私も初心者ですが...
editは以下のようにしてみてはいかがでしょうか?おそらくidが渡っていないのでuserが見つけられず怒られているのではないでしょうか?コードを拝見しましたが、Showdeletelink_toは正常に動きますか?

<td><%= link_to 'Edit', edit_user_path(user.id) %></td>

後者の問題ですが、個人の名前やメールアドレスは個人しか見えないようにしたい、とのことなので、そのページではログイン機能があると推測しました。そうすると、ログイン中のユーザのidをとってくることで、そのidを用いてwhere文やfind_byなどでユーザを探せばよろしいのではないでしょうか?
そうして探したuserの情報を元に、各種情報を表示すれば良いと思います。

投稿2016/01/22 19:24

yh1126

総合スコア17

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

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

culuculu

2016/01/22 23:13 編集

回答ありがとうございます。 Showと Deleteのlink_toは正常に動いています。 ログイン認証機能を説明していませんでした。申し訳ありません。 whereやfind_byについて学習してみたところ、find_by_idがエラーの対策良さそうだったのでこれを選択しました。 早速試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問