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

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

ただいまの
回答率

90.47%

  • Ruby

    7968questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7509questions

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

  • Ruby on Rails 4

    2456questions

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

rails でレビューを実装したいのですがform作成でエラーが出ます。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 5,849

k.m.m.m

score 57

rails4.2.5です。

evaluationsテーブルにフォームで値を送信しようと思っているのです
が、evaluations_controller.rbのstrong parametersを作成すると

param is missing or the value is empty: evaluations

というエラーが起きてしまいます。

コードは以下のとおりです。

evaluations_controller.rb

class EvaluationsController < ApplicationController

  def evaluation
    @teacher = Teacher.find_by(params[:teacher_id])
    @evaluations = current_student.evaluations.build(evaluation_params)
    @evaluations.save
  end

  def index
    @teacher = Teacher.find_by(params[:teacher_id])
    @evaluations_of_teacher = @teacher.evaluations.all
  end


private

  def evaluation_params
   params.require(:evaluations).permit( :title, :body, :teacher_id )
  end

end

views/evaluations/evaluation.html.erb

<%= form_for @evaluations, url: evaluation_path, method: :post do |f| %>
  <p><%= f.text_field :title %></p>
  <p><%= f.text_area :body %></p>
  <%= f.hidden_field :teacher_id, :value => @teacher.id %>
  <%= f.submit %>
<% end %>

schemafile

create_table "evaluations", force: :cascade do |t|
  t.integer  "teacher_id",             default: ""
  t.integer  "student_id"
  t.string   "title",                  default: ""
  t.text     "body"

  t.datetime "created_at",             null: false
  t.datetime "updated_at",             null: false
end

routes.rb

Rails.application.routes.draw do
  root 'home#index'

  devise_for :teachers, :controllers => {
                          :sessions      => "teachers/sessions",
                          :registrations => "teachers/registrations",
                          :passwords     => "teachers/passwords",
                        #  :omniauth_callbacks => "teachers/omniauth_callbacks"
                        }



  devise_for :students, :controllers => {
                          :sessions      => "students/sessions",
                          :registrations => "students/registrations",
                          :passwords     => "students/passwords",
                        #  :omniauth_callbacks => "students/omniauth_callbacks"
                        }


  resources :teachers, only: [:show, :index] do
     resources :evaluations, only: [:index]
  end 

  get 'evaluation' => evaluations#evaluation', as:'evaluation'
  post 'evaluation' => 'evaluations#evaluation'
  delete 'unevaluation/:teacher_id' => 'evaluations#unevaluation'


  # The priority is based upon order of creation: first created -> highest priori
ty.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
  # root 'welcome#index'

  # Example of regular route:
  #   get 'products/:id' => 'catalog#view'

  # Example of named route that can be invoked with purchase_url(id: product.id)
  #   get 'products/:id/purchase' => 'catalog#purchase', as: :purchase

  # Example resource route (maps HTTP verbs to controller actions automatically):
  #   resources :products

  # Example resource route with options:
  #   resources :products do
  #     member do
  #       get 'short'
  #       post 'toggle'
  #     end
  #
  #     collection do
  #       get 'sold'
  #     end
  #   end

  # Example resource route with sub-resources:
  #   resources :products do
  #     resources :comments, :sales
  #     resource :seller
  #   end

  # Example resource route with more complex sub-resources:
  #   resources :products do
  #     resources :comments
  #     resources :sales do
  #       get 'recent', on: :collection
  #     end
  #   end

  # Example resource route with concerns:
  #   concern :toggleable do
  #     post 'toggle'
  #   end
  #   resources :posts, concerns: :toggleable
  #   resources :photos, concerns: :toggleable

  # Example resource route within a namespace:
  #   namespace :admin do
  #     # Directs /admin/products/* to Admin::ProductsController
  #     # (app/controllers/admin/products_controller.rb)
  #     resources :products
  #   end
end

strong parametersの記述をコメントアウトすると、
strong parametersを必要としない値はちゃんとevaluationsテーブルに保存されるのに、
strong parametersの記述をすると、

ActionController::ParameterMissing (param is missing or the value is empty: evaluations):

というエラーが表示されます。
たくさんググっても解決策が見当たらなかったので分かる方教えて欲しいです。

ググったサイト
http://nograve.hatenadiary.jp/entry/2015/11/05/161948

http://hbnist76.blog.fc2.com/blog-entry-424.html

http://ja.stackoverflow.com/questions/399/rails4%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AEpost%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E3%81%97%E3%81%9F%E3%81%84%E3%81%8C-actioncontrollerparametermissing-%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%8D%E3%81%AA

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • k.m.m.m

    2016/03/26 14:26

    ググったサイトをこのコメントの返信は見えにくかったので、質問の方にも載せていただきました。 ご指導ありがとうございます。

    キャンセル

  • nami634

    2016/03/27 00:27

    routes.rbも載せてください

    キャンセル

  • k.m.m.m

    2016/03/28 19:18

    遅れて申し訳有りません。 mysqlの方でエラーが発生していました。 routes.rbも追加しましたので宜しくお願いします。

    キャンセル

回答 2

check解決した方法

+3

命名を全てrailsの用意しているメソッドに従って作成したところ、解決しました。

evaluations_controller.rb

class EvaluationsController < ApplicationController

  def new
   @evaluaitons = Evaluation.new
  end


  def create
    @teacher = Teacher.find(params[:teacher_id])
    @evaluations = current_student.evaluations.build(evaluation_params)
    @evaluations.teacher_id = @teacher.id
    @evaluations.save
    @redirect_to @teacher
  end

  def index
    @teacher = Teacher.find(params[:teacher_id])
    @evaluations_of_teacher = @teacher.evaluations
  end


private

  def evaluation_params
   params.require(:evaluations).permit( :title, :body )
  end

end

view/evaluaions/new.html.erb

<%= form_for :evaluations,url: {action: :create} do |f| %>
  <p><%= f.text_field :title %></p>
  <p><%= f.text_area :body %></p>
  <%= f.submit %>
<% end %>


config/routes.rb

resources :teachers, only: [:show, :index] do
   resources :evaluaitons, only: [:new, :create, :show, :edit, :destroy]
   member do
     resources :evaluations, only: [:index]
   end
  end

このようにしたら、ちゃんとストロングパラメーターを認識してくれて、テーブルに値が送信できるようになりました。

メソッドもformもroutingも変えたところできました。
おそらく、params is missingは、newメソッドで作成するはずの空の値が最初に入っていなければいけないのに、入っていなかったことが原因だと思われます。
よかったら参考にしてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

http://www.rubydoc.info/docs/rails/4.0.0/ActionController/ParameterMissing

>Raised when a required parameter is missing.

こう書かれていますね。

つまり、パラメーターが見つからないということです。

><%= f.hidden_field :teacher_id, :value => @teacher.id %>

ここの値が送られていないと思います。
デバッグしないと分からないので、一度デバッグして値を確かめることをお勧めします。

teacher_idをhiddenで送信しないというのであれば、下記のようにすれば動くと思います。

class EvaluationsController < ApplicationController

  def evaluation
    @teacher = Teacher.find_by(params[:teacher_id])
    @evaluations = current_student.evaluations.build(evaluation_params)
    @evaluations.id = @teacher.id ←ここを追加
    @evaluations.save
  end

  def index
    @teacher = Teacher.find_by(params[:teacher_id])
    @evaluations_of_teacher = @teacher.evaluations.all
  end


private

  def evaluation_params
   params.require(:evaluations).permit( :title, :body)←teacher_idなくしました。
  end

end

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/28 19:20

    返信に遅れてすみません。
    mysqlのエラーを対処していました。
    コード付きの非常にわかりやすい解答ありがとうございます。
    ayuさんのコメントのようにやってみたのですが、
    最初と変わらないエラーを吐かれてしまいました。

    キャンセル

  • 2016/03/28 21:41

    そうですか。

    私ではデバッグして、**params**の中身を見ないとわからないですね。

    http://blog.livedoor.jp/sasata299/archives/51841232.html
    http://morizyun.github.io/blog/better-error-gem-rails-ruby-rack/

    この辺のデバッグツールを使って、paramsの中身を見るのがベストです。
    単純なミスになっていると思います。

    キャンセル

  • 2016/03/30 09:32

    ありがとうございます。
    デバッグしてみますm(_ _)m

    またうまくいったら書きますのでよろしくお願いします。

    キャンセル

関連した質問

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

  • Ruby

    7968questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7509questions

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

  • Ruby on Rails 4

    2456questions

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