1. ホーム
  2. ruby-on-rails

[解決済み] NilClass:Class に対して、Rails の未定義メソッド `model_name' が存在する。

2022-02-19 13:17:51

質問

私はすべてのページのトップに表示させたいフォームを持っているので、それを /app/views/layouts/application.html.erb ファイルに含めましたが、エラーが発生しました。 undefined method ページをロードしようとすると、NilClass:Class`に対して'model_name'と表示されます。

以下は、application.html.erbのフォームのスニペットです。

 <%= form_for @user do |f| %>
    <h3>Add new contact</h3>
    <%= f.text_field :first_name %><br />
    <%= f.text_field :last_name %>
    <%= f.text_field :email %>
    <hr />
    <%= f.submit "Add Contact" %>
<% end %>

以下は、私の /app/controllers/user_controller.rb です。

class UserController < ApplicationController

    def index

    end

    def new
        @user = User.new
    end

end

フォームがapplication.html.erbファイルにあるので、何らかの方法でパスを指定する必要があるため、このエラーが発生するのだと考えています。

他に掲載が必要なものがあれば教えてください。

EDIT Olaの提案に従って、私のapp/views/layouts/application.html.erbファイルでは、次のようなものがあります。

<div>
<%= yield :add_user %>
</div>

そして、app/views/users/new.html.erb ファイルに以下のように記述します。

<% content_for :add_user do %>
    <%= form_for @user do |f| %>
        <h3>Add new contact</h3>
        First Name<br />
        <%= f.text_field :first_name %><br />
        Last Name<br />
        <%= f.text_field :last_name %><br />
        Email<br />
        <%= f.text_field :email %>
        <hr />
        <%= f.submit "Add Contact" %>
    <% end %>
<% end %>

フォームがレンダリングされないのは、私のurlが http://localhost:3000/admin/index を探すので add_user content_for in app/views/admin/index.html.erb

解決方法は?

複数のアクション(ページ)に対してフォームが含まれる場合、そのフォームに @user を何かに置き換えるか、あるいは form_for ディレクティブは失敗します (フォームを作成するためのものを持ちません)。 のために ).

よりよい方法 (そしてRailsのデフォルト) は、アクションごとに個別のビューを用意し、それぞれにそのアクションが必要とする要素だけを含ませ、そのビューを application.html.erb レイアウトを <%= yield %> . ですから、あなたは app/views/users/new.html.erb ビューで、その中にフォームがあります。あなたは <ストライク 決して Railsではロードパスを定義する必要はほとんどなく、すべてモデル、コントローラ、アクションの名前から、あるいは routes.rb . の核となる部分です。 設定より規約 Railsに深く浸透しているパラダイムです。

編集する もし、あなたが する 新しいオブジェクトを作成するためのフォームを各ページに用意する必要がある場合 (たとえば UserSessions でよく使われます) は、そのために form_for オブジェクトが存在することに依存しないようにします。

form_for(User.new)

に強制的に投稿させる必要がある場合や create メソッド

form_for(User.new, :url => { :action => "create" }) 

リソース駆動の詳細については、こちらをご覧ください。 form_for の中で Ruby On Rails APIのドキュメントです。