38794


Railsを勉強中です。現在、フォームの作成で入力画面を作成しています。

index.html.erbで以下のエラーが発生してしまい、うまくいきません。  
解決策を教えていただけると幸いです。

[code]

    ArgumentError in Contact#index
    First argument in form cannot contain nil or be empty
    
    <%= form_for(@contact, url:{controller:'contact', action:'create'}) do |f| %>
    
[/code]

contact_controller.rb

[code]

    class ContactController < ApplicationController
      def index
        @msg = "メッセージだよ"
      end
    
      def create
        @contact = Contactkun.new(new_params)
    
        if @contact.save
          @msg = "送信完了"
        else
          @msg = "エラー"
        end
      end
    
      private
      def new_params
        params.require(:contactkun).permit(:name, :content)
      end
    end
    
[/code]

contactkun.rb

[code]

    class Contactkun < ApplicationRecord
      # フォームのバリデーション
      validates :name, presence: true
      validates :contact, presence: true
    end
    
[/code]

index.html.erb

[code]

    <p><%= @msg %></p>
    
    <%= form_for(@contact, url:{controller:'contact', action:'create'}) do |f| %>
    
      <% if @contact.errors.any? %>
        <% @contact.errors.full_messages.each do |message| %>
          <p><%= message %></p>
        <% end %>
      <% end %>
    
    <table>
      <tr><td>名前</td><td><%= f.text_field :name %></td></tr>
      <tr><td>内容</td><td><%= f.text_area :content %></td></tr>
      <tr><td></td><td><%= f.submit "問い合わせる" %></td></tr>
    </table>
    <% end %>
    
[/code]


CC BY-SA 3.0
2017-10-17T05:53:36.620
38782
2017-10-17T07:56:08.690
25223
question
ruby-on-rails
Ruby on Rails フォームをうまく作成できません

[code]

    <%= form_for(@contact, url:{controller:'contact', action:'create'}) do |f| %>
    
[/code]

で`@contact`がnilなのでエラーになっています。

コントローラの`index`メソッドに

[code]

    @contact = Contactkun.new
    
[/code]

を追加してください。

ただ、このコードだと命名規則がRailsの流儀からはずれてるとか、例えば`@contact.save`に失敗したときのために同じフォームを別に用意しないといけないなどいろいろ問題がありそうです。

1から作るのではなく、scaffoldで生成されるコードをベースにした方がいいです。また、Railsの基本的な作法がわからないなら、[Rails
tutorial](http://railstutorial.jp)などで基礎を一通り勉強されるのが良いでしょう。


CC BY-SA 3.0
2017-10-17T07:56:08.690
38794
2017-10-17T07:56:08.690
5793
38782
answer