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

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

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

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

Q&A

解決済

Railsのform_forで"First argument in form cannot contain nil or be empty"

mogemoge
mogemoge

総合スコア12

Ruby on Rails

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

2回答

0グッド

2クリップ

17627閲覧

投稿2017/01/27 10:31

編集2017/01/29 11:36

###前提・実現したいこと
ユーザ登録機能を作り始めたのですが、form_forでエラーが出てしまいます。

###発生している問題・エラーメッセージ

ActionView::Template::Error (First argument in form cannot contain nil or be empty): 23: 24: <h3>ユーザ登録</h3> 25: 26: <%= form_for @user do |f| %> 27: 28: <div class="field"> 29: <%= f.label :name, "UserID" %>

###該当のソースコード
new.html.erb

html

1<p><font color=red><%= flash[:alert] %></font></p> 2<%= form_tag login_path do %> 3<table id="login_form"> 4 <tr> 5 <td><%= label_tag :name, 'UserID' %></td> 6 <td><%= text_field_tag :name, params[:name] %></td> 7 </tr> 8 9 <tr> 10 <td><%= label_tag :pass, 'Password' %></td> 11 <td><%= password_field_tag :pass, params[:pass] %></td> 12 </tr> 13 14 <tr> 15 <td><%= submit_tag "Login" %></td> 16 </tr> 17</table> 18<% end %> 19 20<br><br> 21 22<h3>ユーザ登録</h3> 23 24<%= form_for @user do |f| %> 25 26 <div class="field"> 27 <%= f.label :name, "UserID" %> 28 <%= f.text_field :name %> 29 </div> 30 31 <div class="field"> 32 <%= f.label :pass, "Password" %> 33 <%= f.text_field :pass %> 34 </div> 35 36 <div class="actions"> 37 <%= f.submit "登録する" %> 38 </div> 39<% end %>

logins.controller.rb

ruby

1class LoginsController < ApplicationController 2 def index 3 render "index" 4 end 5 6 def show 7 render "new" 8 end 9 10 def new 11 @users = User.all 12 @user = User.new 13 end 14 15 def create 16 user = User.find_by_name params[:name] 17 if user && user.authenticate(params[:pass]) 18 session[:user_id] = user.id 19 redirect_to root_path 20 else 21 flash.now.alert = "もう一度入力してください。" 22 render "new" 23 end 24 end 25 26 def destroy 27 session[:user_id] = nil 28 @current_user = nil 29 redirect_to root_path 30 end 31end

routes.rb(訂正)

ruby

1Rails.application.routes.draw do 2 get 'questions/index' 3 4 get 'questions/show' 5 6 get 'questions/ajax_method'=>'questions#ajax_method',as:'ajax_method' 7 8 get 'questions/button'=>'questions#button',as:'button' 9 10 root 'logins#index' 11 resource :login, only: %i{show create destroy} 12 13 #rake routes 14 15 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 16end

###試したこと
newアクションで@userを作成しているのですがnilといわれてしまいます。

###補足情報(言語/FW/ツール等のバージョンなど)
Rails 5.0.0.1

###追記
マイグレーションファイル(20170110165330_create_users.rb)

ruby

1class CreateUsers < ActiveRecord::Migration[5.0] 2 def change 3 create_table :users do |t| 4 5 t.boolean :exist,default: false 6 7 t.integer :number 8 9 t.string :name 10 t.string :password_digest 11 12 t.float :theta,default: 0.0 13 14 t.timestamps 15 end 16 end 17end

bundle exec rake routes実行結果

Prefix Verb URI Pattern Controller#Action questions_index GET /questions/index(.:format) questions#index questions_show GET /questions/show(.:format) questions#show ajax_method GET /questions/ajax_method(.:format) questions#ajax_method button GET /questions/button(.:format) questions#button root GET / logins#index login POST /login(.:format) logins#create GET /login(.:format) logins#show DELETE /login(.:format) logins#destroy

routes.rbを訂正しました。

schema.rb

ruby

1ActiveRecord::Schema.define(version: 20170110165330) do 2 3 create_table "questions", force: :cascade do |t| 4 t.integer "qid" 5 t.string "field" 6 t.text "question" 7 t.string "answer" 8 t.string "dummy1" 9 t.string "dummy2" 10 t.string "dummy3" 11 t.string "dummy4" 12 t.string "dummy5" 13 t.text "note" 14 t.float "b" 15 t.integer "user1", default: 0 16 t.integer "user2", default: 0 17 t.integer "user3", default: 0 18 t.integer "user4", default: 0 19 t.integer "user5", default: 0 20 t.integer "user6", default: 0 21 t.integer "user7", default: 0 22 t.integer "user8", default: 0 23 t.integer "user9", default: 0 24 t.integer "user10", default: 0 25 t.datetime "created_at", null: false 26 t.datetime "updated_at", null: false 27 end 28 29 create_table "users", force: :cascade do |t| 30 t.boolean "exist", default: false 31 t.integer "number" 32 t.string "name" 33 t.string "password_digest" 34 t.float "theta", default: 0.0 35 t.datetime "created_at", null: false 36 t.datetime "updated_at", null: false 37 end 38 39end

user.rb

ruby

1class User < ApplicationRecord 2 has_secure_password 3end

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

satoshih

2017/01/29 05:42 編集

bundle exec rake routes を実行した結果も記載していただけますか? (#newがroutesに設定されているか見てみたいです。
satoshih

2017/01/29 05:53

追記ありがとうございます。やっぱり#newがないですね。。。エラーが出てるのはcontrollerのどのmethodを通ったときかわかりますか?logに出てると思います
mogemoge

2017/01/29 06:12

app/controllers/logins_controller.rb:7:in `show'とあります。

回答2

2

ベストアンサー

controllerの#newは使われず、#showが使われているようなので

controllerの#showに

ruby

1def show 2 @user = User.new 3 render "new" 4end

と書くか、

config/routes.rbを

diff

1- resource :login, only: %i{show create destroy} 2+ resource :login, only: %i{create destroy} 3+ get 'login', to: 'logins#new'

のように変更すると動くと思われます。

投稿2017/01/29 08:53

satoshih

総合スコア788

sweden1👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

mogemoge

2017/01/29 11:22

そうすると、 undefined method `users_path' for #<#<Class:0x0055e23edf2318>:0x0055e23edead20> となってしまいました。
satoshih

2017/01/30 07:58 編集

form_for でUserのインスタンスが指定されているからですね。 viewのform_forのタグを <%= form_for(@user, url: { controller: :logins, action: :new }) do |f| %> に書き換えて試してみてください
mogemoge

2017/02/04 07:24

できました。ありがとうございました!

0

DBのソースを見せてはいただけませんか?

投稿2017/01/28 04:59

sweden1

総合スコア59

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

mogemoge

2017/01/29 03:16

記載しました。これでよいでしょうか?
sweden1

2017/01/29 08:49

モデルもみしていただけますか?
mogemoge

2017/01/29 11:24

schemaでよいのでしょうか?
mogemoge

2017/01/29 11:36

user.rbを記載しました。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails

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