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

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

ただいまの
回答率

90.84%

  • Ruby on Rails 4

    2372questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Rails 4.2.10でform_forの送信情報をコントローラで受け取れずエラーになる

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 68

koichi8888

score 11

 前提・実現したいこと

ユーザがフォームからPOSTしたデータをコントローラのインスタンス変数で受け取りたい。

Railsでアプリを作っています。
単純にフォームから送信したデータをコントローラで受け取りたいのですが、ParameterMissingが出て困っています。

データの登録はできるのですが、データの更新ができない状態です。

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

ActionController::ParameterMissing in ItemsController#update
param is missing or the value is empty: GyomuDatum
Extracted source (around line #57):
55
56
57
58
59
60

    def item_params
#      params.require(:GyomuDatum).permit(:manage_id)
      params.require(:GyomuDatum).permit(:manage_id, :category_id, :publish_corporation, :ip_address, :target_server, :start_date, :end_date, :comment)
#      params.require.fetch(:GyomuDatum,{}).permit(:manage_id, :category_id, :publish_corporation, :ip_address, :target_server, :start_date, :end_date, :comment)
    end


Rails.root: /Myapp

Application Trace | Framework Trace | Full Trace
app/controllers/items_controller.rb:57:in `item_params'
app/controllers/items_controller.rb:46:in `update'
Request
Parameters:

{"utf8"=>"✓",
 "_method"=>"patch",
 "authenticity_token"=>"8A0DmjBpCoCfgy2+GjBi24F9bb3KG1opx1F7xSAijF9Bp1zizUrMDuiWmvZeuP75i+XXX3+zNAhHObiN2xO03A==",
 "gyomu_datum"=>{"manage_id"=>"a",
 "category_id"=>"0",
 "publish_corporation"=>"a",
 "ip_address"=>"a",
 "target_server"=>"a",
 "start_date"=>"2018-04-01",
 "end_date"=>"2018-04-01",
 "comment"=>"a?update"},
 "commit"=>"Update Gyomu datum",
 "id"=>"37"}

 該当のソースコード

edit.html.erb

<%= form_for @item, url: item_path(@item) do |f| %>
<h1>
  データ編集
</h1>
<p>
  管理ID:
    <br>
  <%= f.text_field :manage_id, placeholder: '管理ID' %>
</p>
<p>
  カテゴリ:
  <br>
  <%= f.text_field :category_id, placeholder: 'カテゴリ' %>
</p>
<p>
  発行会社:
  <br>
  <%= f.text_field :publish_corporation, placeholder: '発行会社' %>
</p>
<p>
  IPアドレス:
  <br>
  <%= f.text_field :ip_address, placeholder: 'IPアドレス' %>
</p>
<p>
  サーバ名:
  <br>
  <%= f.text_field :target_server, placeholder: 'サーバ名' %>
</p>
<p>
  有効期限の開始:
  <br>
  <%= f.text_field :start_date, placeholder: '2018-04-01' %>
</p>
<p>
  有効期限の終了:
  <br>
  <%= f.text_field :end_date, placeholder: '2018-04-01' %>
</p>
<p>
  コメント:
  <br>
  <%= f.text_area :comment, placeholder: 'コメント' %>
</p>
<p>
  <%= f.submit %>
</p>



<% end %>


new.html.erb

<%= form_for :GyomuDatum, url: items_path do |f| %>
<h1>
  データ登録
</h1>
<p>
  管理ID:
    <br>
  <%= f.text_field :manage_id, placeholder: '管理ID' %>
</p>
<p>
  カテゴリ:
  <br>
  <%= f.text_field :category_id, placeholder: 'カテゴリ' %>
</p>
<p>
  発行会社:
  <br>
  <%= f.text_field :publish_corporation, placeholder: '発行会社' %>
</p>
<p>
  IPアドレス:
  <br>
  <%= f.text_field :ip_address, placeholder: 'IPアドレス' %>
</p>
<p>
  サーバ名:
  <br>
  <%= f.text_field :target_server, placeholder: 'サーバ名' %>
</p>
<p>
  有効期限の開始:
  <br>
  <%= f.text_field :start_date, placeholder: '2018-04-01' %>
</p>
<p>
  有効期限の終了:
  <br>
  <%= f.text_field :end_date, placeholder: '2018-04-01' %>
</p>
<p>
  コメント:
  <br>
  <%= f.text_area :comment, placeholder: 'コメント' %>
</p>
<p>
  <%= f.submit %>
</p>
<% end %>


items_controller.rb

class ItemsController < ApplicationController

  def index
    @items = GyomuDatum.all.order(created_at: 'desc')
  end

  def show
  end

  def new
    @item = GyomuDatum.new
  end

  def create
    # render plain: params[:GyomuDatum].inspect
    # save
    # @item = Item.new(params[:GyomuDatum])
    # @item = GyomuDatum.new(params.require(:GyomuDatum).permit(:manage_id, :category_id, :publish_corporation, :ip_address, :target_server, :start_date, :end_date, :comment))
     @item = GyomuDatum.new(item_params)
    # @item.save
     # redirect
    # redirect_to items_path

    if @item.save
      # redirect
      redirect_to items_path
    else
      render plain: @item.errors.inspect
      # render plain: @item.errors.inspect
      render 'new'
    end


  end


  def edit
    @item = GyomuDatum.find(params[:id])
  end

  def update
   @item = GyomuDatum.find(params[:id])
#   pp @item
#   pp item_params

    if @item.update(item_params)
      redirect_to items_path
     else
      render 'edit'
    end
  end


  private
    def item_params
#      params.require(:GyomuDatum).permit(:manage_id)
      params.require(:GyomuDatum).permit(:manage_id, :category_id, :publish_corporation, :ip_address, :target_server, :start_date, :end_date, :comment)
#      params.require.fetch(:GyomuDatum,{}).permit(:manage_id, :category_id, :publish_corporation, :ip_address, :target_server, :start_date, :end_date, :comment)
    end

#  private
#    def post_params
#      params.require(:post).permit(:title, :body)
#    end

end

 試したこと

データ登録は記載しているprivateメソッドで登録ができる状態です。

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

・Phusion Passenger
Phusion Passenger 5.2.3

・Apache
Server version: Apache/2.4.6 (CentOS)

・Rails
Rails 4.2.10

・OSバージョン
CentOS Linux release 7.4.1708 (Core)

・Mysql
mysql  Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using  EditLine wrapper

・Ruby
ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-linux]

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

下のPOSTデータを見てのとおり、キーが"gyomu_datum"で来ています。params.require(:gyomu_datum)としましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/18 14:13

    ありがとうございます。記載を変更したところ、解決しました。
    また、もう一点質問があるのですが、データ更新はできるようになったのですが、データ登録ができなくなりました。原因としてはキーが"GyomuDatum"のためです。データ更新とデータ登録でキーが違うのは記載の問題かと思っているのですが、GyomuDatumという記載箇所を一つずつ変更してみたのですが、該当箇所が特定できません。該当箇所を教えて頂けますでしょうか。

    キャンセル

  • 2018/05/18 14:22

    new.html.erbで「form_for :GyomuDatum」としているのが原因だと思われます。

    エラー時の再入力なども考えれば、コントローラーでGyomuDatum.newして、「form_for @item」とすれば、入力フォームをeditと兼用できて一石二鳥です。

    キャンセル

  • 2018/05/18 15:14

    早速のご回答ありがとうございます。ご指摘通りの原因でした。エラー時の再入力に関しては@itemとした場合にキーも@itemになるのですが、それを防ぐためにGyomuDatum.newが必要ということでしょうか。

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Ruby on Rails 4

    2372questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。