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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

253閲覧

名前の出力をしたいのですが、エラーとまっさらしか出ません……

harisann

総合スコア14

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/03/23 12:27

編集2018/03/23 12:30

名前の出力をしたいです。
具体的には、名前登録のビューで打ち込んだ名前を、次のページのhomeビューのページに出力したいです。

<コントローラ> def create @teacher = Teacher.new( id: params[:id], name: params[:name] ) if @teacher.save redirect_to("/home/#{@teacher.id}") else flash[:notice] = "Please teach us your name." render action: :name end end def home end
<名前登録ビュー> <%=form_tag("/create") do%> <input name="name"> <input type="submit" value="opan the door!"> <%end%>
<homeビュー> <%= @teacher.name %>
<ルーティング> …… get "create" => "teacher#create" post "create" => "teacher#create" get "home/:id" => "teacher#home" ……

知ってる知識で書いて、単に名前を出力するだけならこれででるはずなのですが、homeに移ったところでなぜか
NoMethodError
がでてきて、その下のは
undefined method `name' for nil:NilClass
と書かれます。
経験から、@teacherが定義されてないのかと思って、強引だけどhomeビューに

<% @teacher = Teacher.find_by(name_t: params[:name])%>

を入力しても変わりませんでした。
ただ、同じところに

<% @teacher = Teacher.new(name_t: params[:name])%>

と入力するとエラーは出ません。が、出力はされず、まっさらなページが出されるだけです。

ただ名前の出力だけなので、変なところを見落としているだけかもしれません。
どなたか、知恵を貸してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

私も初心者なのでもしかすると間違えているかもしれませんが

<ルーティング> get "create" => "teacher#create" post "create" => "teacher#create"

の部分のgetとpost両方に同じアクションが設定されているのが原因ではないでしょうか?

<ルーティング> get "create" => "teacher#create_form" post "create" => "teacher#create"
<コントローラ> def create_form end def create @teacher = Teacher.new( id: params[:id], name: params[:name] ) if @teacher.save redirect_to("/home/#{@teacher.id}") else flash[:notice] = "Please teach us your name." render action: :name end end

とするなどしてみるとうまくいくかもしれません。
もし上記のように書き換えた場合はViewファイルもcreate_form.html.erbに書き換えてください。

追記
もう一度見直して自分でもやってみました。
途中name_tと見慣れないカラム名が見えましたがteachersテーブルのカラム名はnameでよろしかったでしょうか?
以下はteachersテーブルのカラム名をnameと前提して行いました。

Teacher.newでidは自動生成されるのでid: params[:id]は不要でした。
おそらくここでidを指定しているにもかかわらず入力が行われないためエラーが出ているのではないでしょうか?

<ルーティング> get 'home/:id' => 'teacher#home' get 'create' => 'teacher#create_form' post 'create' => 'teacher#create'
<コントローラ> def home @teacher = Teacher.find_by(id: params[:id]) end def create_form @teacher = Teacher.new #書かなくても可 end def create @teacher = Teacher.new( #idは自動生成される name: params[:name] ) if @teacher.save redirect_to("/home/#{@teacher.id}") else flash[:notice] = "Please teach us your name." render action: :name end end

で問題なく動作しました。

投稿2018/03/24 09:14

編集2018/03/25 00:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

harisann

2018/03/24 16:51

回答ありがとうございます! すみません、無理でした…… NoMethodErrorが出てきてしまいました……
退会済みユーザー

退会済みユーザー

2018/03/25 00:38

すみません、見落としがあったみたいです。 追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問