🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

Q&A

解決済

1回答

908閲覧

Strong Parametersがうまく使えなくて困っております。

yoshi544

総合スコア5

Ruby

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

Ruby on Rails

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

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

0グッド

0クリップ

投稿2021/01/31 01:33

Railsにて勤怠管理アプリでパラメータの中身がnilになってしまう?

※Markdown形式が慣れていないので、うまく書けていなかったらすいません 汗

##環境
AWS cloud9
Rails 5.1.7
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

##現状で困っていること
拠点ページというページ内で、拠点情報の新規追加ができない。
なぜか、コンソールからは新規作成が正常にできる。

##解決したいこと
Strong Parametersを使って拠点ページにデータを作成ができるように
実装したい。

#現状のコード以下を記載↓
index.html.erb
bases_controller.rb
_new_form.html.erb
routes.rb
schema.rb

###ここからはコードを記載

index

1<% provide(:title, 'Bases') %> 2<% provide(:class_text, 'base') %> 3<% provide(:button_text, '作成する') %> 4<h1> 拠点一覧 </h1> 5 6<div class="col-md-10 col-md-offset-1"> 7 <table class="table table-striped table-bordered table-condensed table-hover" id="table-bases"> 8 <thead> 9 <tr> 10 <th></th> 11 <th></th> 12 <th class="center">拠点番号</th> 13 <th class="center">拠点名</th> 14 <th class="center">勤怠種類</th> 15 </tr> 16 </thead> 17 18 <tbody> 19 <% @bases.each do |base| %> 20 <tr> 21 <td> 22 <button type="button" data-toggle="collapse" data-target="#<%= base.base_number %>" class="btn btn-primary">修正</button> 23 </td> 24 <td> 25 <%= link_to "削除", base, method: :delete, 26 data: { confirm: "削除してよろしいですか?" }, class: "btn btn-primary" %> 27 </td> 28 <td class="center"><%= base.base_number %></td> 29 <td class="center"><%= base.base_name %></td> 30 <td class="center"><%= base.information %></td> 31 </tr> 32 <tr> 33 <td> 34 <div id="<%= base.base_number %>" class="collapse"> 35 <div class="panel-body"> 36 <%= render 'edit_form' %> 37 </div> 38 </div> 39 </td> 40 </tr> 41 <% end %> 42 </tbody> 43 </table> 44 45 <tr> 46 <td> 47 <div class="panel panel-default"> 48 <div class="panel-heading"> 49 <button type="button" data-toggle="collapse" data-target="#add_base" class="btn btn-lg btn-primary">拠点情報追加</button> 50 </div> 51 <div id="add_base" class="collapse"> 52 <div class="panel-body"> 53 <%= render 'new_form' %> 54 </div> 55 </div> 56 </div> 57 </td> 58 </tr> 59</div>

base

1class BasesController < ApplicationController 2 before_action :admin_user, only: [:new, :create, :edit, :update, :index, :show, :destroy] 3 before_action :set_base, only: [:edit, :update, :destroy] 4 5 6 def new 7 @base = Base.new 8 end 9 10 def create 11 @base = Base.new(base_params) 12 if @base.save 13 flash[:success] = '拠点情報を作成しました。' 14 redirect_to bases_url 15 else 16 flash[:danger] = "拠点情報の作成に失敗しました。" + @base.errors.full_messages.join("<br>") 17 redirect_to bases_url 18 end 19 end 20 21 def edit 22 end 23 24 def update 25 if @base.update_attributes(base_params) 26 flash[:success] = "拠点情報を更新しました。" 27 redirect_to bases_url 28 else 29 flash[:danger] = "拠点情報の更新に失敗しました。" + @base.errors.full_messages.join("<br>") 30 redirect_to bases_url 31 end 32 end 33 34 def index 35 @bases = Base.all 36 end 37 38 def show 39 end 40 41 def destroy 42 if @base.destroy 43 flash[:success] = "拠点情報を消去しました。" 44 redirect_to bases_url 45 else 46 end 47 end 48 49 private 50 51 def set_base 52 @base = Base.find(params[:id]) 53 end 54 55 def base_params 56 params.require(:base).permit(:base_number, :base_name, :information) 57 end 58end

new

1<%= form_with(model: @base, local: true) do |f| %> 2 <!--<!%= render 'shared/error_messages', object: @base %>--> 3 4 <%= f.label :base_number, class: "label-#{yield(:class_text)}" %> 5 <%= f.number_field :base_number, class: "form-control" %> 6 7 <%= f.label :base_name, class: "label-#{yield(:class_text)}" %> 8 <%= f.text_field :base_name, class: "form-control" %> 9 10 <%= f.label :information, class: "label-#{yield(:class_text)}" %> 11 <%= f.text_field :information, :placeholder => "出勤または退勤を入力してください。", class: "form-control" %> 12 13 <%= f.submit yield(:button_text), class: "btn btn-primary btn-block btn-#{yield(:class_text)}" %> 14<% end %>

routes

1Rails.application.routes.draw do 2 3 root 'static_pages#top' 4 get '/signup', to: 'users#new' 5 6 # ログイン機能 7 get '/login', to: 'sessions#new' 8 post '/login', to: 'sessions#create' 9 delete '/logout', to: 'sessions#destroy' 10 11 resources :bases 12 resources :users do 13 collection { post :import } 14 member do 15 get 'edit_basic_info' 16 patch 'update_basic_info' 17 get 'attendances/edit_one_month' 18 patch 'attendances/update_one_month' 19 end 20 resources :attendances, only: :update 21 end 22end

schema

1ActiveRecord::Schema.define(version: 20210130115200) do 2 3 create_table "attendances", force: :cascade do |t| 4 t.date "worked_on" 5 t.datetime "started_at" 6 t.datetime "finished_at" 7 t.string "note" 8 t.integer "user_id" 9 t.datetime "created_at", null: false 10 t.datetime "updated_at", null: false 11 t.index ["user_id"], name: "index_attendances_on_user_id" 12 end 13 14 create_table "bases", force: :cascade do |t| 15 t.integer "base_number" 16 t.string "base_name" 17 t.text "information" 18 t.integer "user_id" 19 t.datetime "created_at", null: false 20 t.datetime "updated_at", null: false 21 t.index ["user_id"], name: "index_bases_on_user_id" 22 end 23 24 create_table "users", force: :cascade do |t| 25 t.string "name" 26 t.string "email" 27 t.datetime "created_at", null: false 28 t.datetime "updated_at", null: false 29 t.string "password_digest" 30 t.string "remember_digest" 31 t.boolean "admin", default: false 32 t.string "affiliation" 33 t.datetime "basic_time", default: "2021-01-29 23:00:00" 34 t.datetime "work_time", default: "2021-01-29 22:30:00" 35 t.time "designated_work_start_time", default: "2000-01-01 00:00:00" 36 t.time "designated_work_end_time", default: "2000-01-01 09:00:00" 37 t.string "employee_number" 38 t.string "uid" 39 t.boolean "superior", default: false 40 t.index ["email"], name: "index_users_on_email", unique: true 41 end 42 43end

##作成ボタンを押した後の症状について
写真のように作成ボタンを押すと、paramの中が無いか、空だよと返ってきます。
parametersには値が入っていると思うんですが、
なぜかこのようなエラーが起きます。
何が悪さをしているのか?または、私自身のパラメータの渡し方がおかしかったのか?

イメージ説明

イメージ説明
解決方法が全然検討がつかず、意気消沈しております。
どなたか解決に向けての道しるべを指して頂けると
大変、ありがたいです!!
何卒、よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2021/01/31 04:07

直接原因は明確です 2つめの画像のParamatersを見ると "base" => { "base_name" => .... } の様になっていないため、params[:base] がnilになってしまってます。 form_with model: @base ならそうなってくれるはzなのに。なぜ?? というところがわからない。
yoshi544

2021/01/31 04:25 編集

ご返信ありがとうございます! 言われてみれば、確かに。。。 いきなりbaseの下のネストされた値を(base_name: ....) 更新しようとしているみたいなニュアンスでよろしいでしょうか? なんでこうなってしまうのでしょうか? form_withの書き方がおかしいのでしょうか? それともほかに原因があるのでしょうか? requireが効いてない?ということなんでしょうか?
winterboum

2021/01/31 04:39

そこが分かってれば、回答に書いてます。。。 わからんのです。不思議。
guest

回答1

0

ベストアンサー

ruby

1def create 2 @base = Base.new(base_params) 3end

@base = Base.create(base_params) にしたらどうなるでしょうか。

ActionController::ParameterMissing
というエラーメッセージはわかりにくいですね。
フォームパラメータが無いと怒られている気がしますが、きっと関数の引数がEmptyだと言う意味だと思います。@baseが無いのに params.require(:base) # @base依存 を呼んだということでは無いかと思います。

追記
Base.newはRubyのクラスインスタンスを作成します。(言語レベル)
Base.createはBaseクラスのシングルトンメソッドです。(フレームワークレベル)
その中でごちょごちょやってから、クラスインスタンスを作って返してくれる関数です。Railsが追加した機能です。

蛇足
Baseのように言語やフレームワークが使いそうなクラス名(データベーステーブル名)は避けて、支店なら BranchOfficeとか、配送拠点なら DistributionSateliteとか被る可能性の少ない名前にしたほうが安全でわかりやすいと思います。

投稿2021/01/31 11:09

編集2021/01/31 11:50
gambaldia

総合スコア266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshi544

2021/02/02 21:51

仕事が立て込んでしまい、返信遅くなりました! 値が渡せていないだけで、記述はおかしくないというのが やはり、皆様のご見解なのかと感じました。 蛇足で記載していただいた様に、クラス名の記載については 自分でもこれからは、気をつけていこうと思います。 まずは、ちょっと思いついたことがあるので、コメントいただいた事を ヒントに実装してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問