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

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

ただいまの
回答率

90.53%

  • Ruby on Rails

    8651questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,737

mogemoge

score 4

前提・実現したいこと

ユーザ登録機能を作り始めたのですが、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

<p><font color=red><%= flash[:alert] %></font></p>
<%= form_tag login_path do %>
<table id="login_form">
  <tr>
    <td><%= label_tag :name, 'UserID' %></td>
    <td><%= text_field_tag :name, params[:name] %></td>
  </tr>

  <tr>
    <td><%= label_tag :pass, 'Password' %></td>
    <td><%= password_field_tag :pass, params[:pass] %></td>
  </tr>

  <tr>
    <td><%= submit_tag "Login" %></td>
  </tr>
</table>
<% end %>

<br><br>

<h3>ユーザ登録</h3>

<%= form_for @user do |f| %>

  <div class="field">
    <%= f.label :name, "UserID" %>
    <%= f.text_field :name %>
  </div>

  <div class="field">
    <%= f.label :pass, "Password" %>
    <%= f.text_field :pass %>
  </div>

  <div class="actions">
    <%= f.submit "登録する" %>
  </div>
<% end %>


logins.controller.rb

class LoginsController < ApplicationController
    def index
        render "index"
    end

    def show
        render "new"
    end

    def new
        @users = User.all
    @user = User.new
  end

    def create
        user = User.find_by_name params[:name]
        if user && user.authenticate(params[:pass])
      session[:user_id] = user.id
      redirect_to root_path
    else
      flash.now.alert = "もう一度入力してください。"
      render "new"
    end
  end

  def destroy
      session[:user_id] = nil
      @current_user = nil
      redirect_to root_path
  end
end


routes.rb(訂正)

Rails.application.routes.draw do
    get 'questions/index'

    get 'questions/show'

    get 'questions/ajax_method'=>'questions#ajax_method',as:'ajax_method'

    get 'questions/button'=>'questions#button',as:'button'

    root 'logins#index'
    resource :login, only: %i{show create destroy}

  #rake routes

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

試したこと

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

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

Rails 5.0.0.1

追記

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

class CreateUsers < ActiveRecord::Migration[5.0]
    def change
        create_table :users do |t|

            t.boolean :exist,default: false

            t.integer :number

            t.string :name
            t.string :password_digest

            t.float :theta,default: 0.0

            t.timestamps
        end
    end
end


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

ActiveRecord::Schema.define(version: 20170110165330) do

  create_table "questions", force: :cascade do |t|
    t.integer  "qid"
    t.string   "field"
    t.text     "question"
    t.string   "answer"
    t.string   "dummy1"
    t.string   "dummy2"
    t.string   "dummy3"
    t.string   "dummy4"
    t.string   "dummy5"
    t.text     "note"
    t.float    "b"
    t.integer  "user1",      default: 0
    t.integer  "user2",      default: 0
    t.integer  "user3",      default: 0
    t.integer  "user4",      default: 0
    t.integer  "user5",      default: 0
    t.integer  "user6",      default: 0
    t.integer  "user7",      default: 0
    t.integer  "user8",      default: 0
    t.integer  "user9",      default: 0
    t.integer  "user10",     default: 0
    t.datetime "created_at",             null: false
    t.datetime "updated_at",             null: false
  end

  create_table "users", force: :cascade do |t|
    t.boolean  "exist",           default: false
    t.integer  "number"
    t.string   "name"
    t.string   "password_digest"
    t.float    "theta",           default: 0.0
    t.datetime "created_at",                      null: false
    t.datetime "updated_at",                      null: false
  end

end

user.rb

class User < ApplicationRecord
    has_secure_password
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • satoshih

    2017/01/29 14:41 編集

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

    キャンセル

  • satoshih

    2017/01/29 14:53

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

    キャンセル

  • mogemoge

    2017/01/29 15:12

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

    キャンセル

回答 2

checkベストアンサー

+1

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

controllerの#showに

def show
  @user = User.new
  render "new"
end

と書くか、

config/routes.rbを

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/29 20:22

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

    キャンセル

  • 2017/01/30 16:56 編集

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

    キャンセル

  • 2017/02/04 16:24

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/29 12:16

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

    キャンセル

  • 2017/01/29 17:49

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

    キャンセル

  • 2017/01/29 20:24

    schemaでよいのでしょうか?

    キャンセル

  • 2017/01/29 20:36

    user.rbを記載しました。

    キャンセル

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

  • Ruby on Rails

    8651questions

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