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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

2902閲覧

Railsの三項演算子の書き方について

ssk

総合スコア332

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/05/08 08:43

編集2017/05/08 09:43

###現状のコード

ruby

1#コントローラー 2params[:coordinator][:section_id] = params[:coordinator][:section_id].blank? ? -1 : params[:coordinator][:section_id]

###やりたいこと
params[:coordinator][:section_id]の値は""です。
""の場合は.blank?で判定して-1を代入するようにしています。

http://qiita.com/quattro_4/items/88578a2044c423cab3f0
の方法でシンプルに書けるかと思ったのですが、nilまたは空白ではないため、うまくいきません。

シンプルに書くにはどのように記述すれば良いでしょうか?
何卒、よろしくお願い致します。

###追記
coordinators_controller.rb

ruby

1class CoordinatorsController < ApplicationController 2 before_action :set_coordinator, only: [:show, :edit, :update, :destroy] 3 4 # GET /coordinators 5 # GET /coordinators.json 6 def index 7 @coordinators = Coordinator.all 8 end 9 10 # GET /coordinators/1 11 # GET /coordinators/1.json 12 def show 13 end 14 15 # GET /coordinators/regist 16 def regist 17 @coordinator = Coordinator.new 18 end 19 20 # GET /coordinators/1/edit 21 def edit 22 end 23 24 # POST /coordinators 25 # POST /coordinators.json 26 def create 27 @coordinator = Coordinator.new(coordinator_params) 28 respond_to do |format| 29 if @coordinator.save 30 format.html { redirect_to @coordinator, notice: 'コーディネーター登録完了' } 31 #format.json { render :show, status: :created, location: @coordinator } 32 else 33 format.html { render :regist } 34 #format.json { render json: @coordinator.errors, status: :unprocessable_entity } 35 end 36 end 37 end 38 39 # PATCH/PUT /coordinators/1 40 # PATCH/PUT /coordinators/1.json 41 def update 42 #params[:coordinator][:section_id] = params[:coordinator][:section_id].blank? ? -1 : params[:coordinator][:section_id] 43 respond_to do |format| 44 if @coordinator.update(coordinator_params) 45 format.html { redirect_to @coordinator, notice: 'Coordinator was successfully updated.' } 46 format.json { render :show, status: :ok, location: @coordinator } 47 else 48 format.html { render :edit } 49 format.json { render json: @coordinator.errors, status: :unprocessable_entity } 50 end 51 end 52 end 53 54 # DELETE /coordinators/1 55 # DELETE /coordinators/1.json 56 def destroy 57 @coordinator.destroy 58 respond_to do |format| 59 format.html { redirect_to coordinators_url, notice: 'Coordinator was successfully destroyed.' } 60 format.json { head :no_content } 61 end 62 end 63 64 private 65 # Use callbacks to share common setup or constraints between actions. 66 def set_coordinator 67 @coordinator = Coordinator.find(params[:id]) 68 end 69 70 # Never trust parameters from the scary internet, only allow the white list through. 71 def coordinator_params 72 params.require(:coordinator).permit(:name, :name2, :coordinator_id, :password, :mail, :section_id, :department_id, :division_id, :position_id, :profimg, :authority_id, :status, :token, :token_limit, {:office_ids => []}) 73 end 74end 75

coordinator.rb

ruby

1class Coordinator < ApplicationRecord 2 after_initialize :set_default 3 private 4 def set_default 5 self.section_id ||= -1 6 end 7end

###さらに追記
regist.html.erb

ruby

1<h1>New Coordinator</h1> 2 3<%= render 'form', coordinator: @coordinator %> 4 5<%= link_to 'Back', coordinators_path %>

_form.html.erb(一部:section_idのみ)

ruby

1<div class="field"> 2 <%= f.label :section, '事業課' %> 3 <%= f.collection_select( :section_id, Section.all, :id, :name, :include_blank => true) %> 4 </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

これは、こう書くしかありません
あえて書くなら

ruby

1params[:coordinator][:section_id]=-1 if params[:coordinator][:section_id].blank?

こうでしょうか、しかし

前の質問に答えてあげれれば,
よかったのですが。

ruby

1 2 before_save :set_default  3private 4 def set_default 5 self.section_id = -1 if self.section_id==nil 6 end

このように新たなレコードがイニシャライズ(初期化)された時に
特に指定がなければ、-1が代入されるというように
モデル層に記述すれば、sskさんの悩みは全て解決されると思います。

てっきりcontroller層に書いたというから

ruby

1def new 2 Coordinator.new(section_id: -1) 3end 4

みたいにしていると思ったのですが。
違ったみたいですね。

あと、DBにdefault_valueを設定するという手もありますね。

投稿2017/05/08 09:02

編集2017/05/08 10:49
moke

総合スコア2241

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

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

ssk

2017/05/08 09:24 編集

ありがとうございます。 早速試してみました。しかし section_idにはNULLが入るSQL文を作成されているようです。。 Mysql2::Error: Column 'section_id' cannot be null: UPDATE `coordinators` SET `section_id` = NULL, `updated_at` = '2017-05-08 09:19:18' WHERE `coordinators`.`id` = 1 追記 DBにdefault_value-1は設定済みです。しかしNullを許可しないようにしているため、プログラミング側で””の場合は-1を入れるようにしなければいけません。
moke

2017/05/08 09:33 編集

, if: :new_record?を外してみてください、上のコードだと更新の時は-1を入れません もし、それでも問題があるなら、そうするとあと考えられるのは。 strong_paramaterぐらいですかね、section_idを許可していますか? とりあえず、CoordinatorControllerを全部見せてください
ssk

2017/05/08 09:33

コントローラーとモデルのコード全文を追記致しました。
moke

2017/05/08 09:33

, if: :new_record?を外してみてください、上のコードだと更新の時は-1を入れません
ssk

2017/05/08 09:36 編集

, if: :new_record?を外して、after_initialize :set_defaultとしたのですが、更新時-1ははいりませんでした。
moke

2017/05/08 09:45 編集

うーん、問題ないですね。 after_initialize :set_default を before_save :set_default にすれば、とりあえず表面上は大丈夫でしょうが... なぜ、def new ではなくdef registにしているかもわかりませんが、 regist.html.erbとその中でrenderしているviewに本質的な問題があるんでしょうね サーバーで作る、-1を入れる→ブラウザで描画して変更後Post→戻ってきたデータから-1が消えている という状態なので
ssk

2017/05/08 09:44 編集

情報を追記致しました。 なぜ、def new ではなくdef registにしているか ↑/newではなく/registで利用したいからです。
ssk

2017/05/08 09:46

before_save :set_default ↑こちらでは-1を入れることができました。
moke

2017/05/08 09:56 編集

:include_blank => true これですね not_nullと:include_blank => trueは共存させない方がいいですね。 active_recordが""をnilに変換しますので あとこう書くと軽くて見通しがいいかもしれません <%= f.select( :section_id, Section.pluck(:name,:id)) %>
ssk

2017/05/08 10:07 編集

ありがとうございます。最後に、、、 <%= f.select( :section_id, Section.pluck(:name, :id)) %> とすると未選択がなくなってしまいます。include_blank => trueで未選択を実現していたのですが、どのように記述すれば良いでしょうか。。
moke

2017/05/08 10:08 編集

section_idのnot_nullを消します。 DBのnullは未定、不能、未確認を表す値です。 または Sectionの中に未選択を追加してそのIDを after_initializeで設定して before_saveで未選択だったら-1を設定する ですね、nullを恐れる気持ちもわかりますが Railsはそこも吸収してくれます。
ssk

2017/05/08 10:11 編集

Sectionの中に未選択を追加してそのIDをafter_initializeで設定して before_saveで未選択だったら-1を設定 ↑度々、申し訳ございません。。こちらはどのように記述すると実現できますか?かれこれ2日ほど悩んでいまして、、 section_idのnot_nullを消すのも視野にいれます。
moke

2017/05/08 10:18 編集

after_initialize :set_not_selected before_save :set_default  private def set_not_selected self.section_id ||= 0#未選択のid(仮) end def set_default self.section_id = -1 if self.section_id==0 end まあ、ほんとそのまんまです。
ssk

2017/05/08 10:28

ありがとうございます>< :include_blank => true で空の要素を追加して、ご提示いただいたコードを貼り付けたのですが、SQL文はsection_id` = NULLとなってしまいました。
ssk

2017/05/08 10:30

以下のコードで:include_blank => trueを指定してもエラーが出なくなりました。問題はなさそうですか? before_save :set_default private def set_default self.section_id = -1 if self.section_id == nil end
moke

2017/05/08 10:48 編集

:include_blank => trueを使わないことを考えていたのですが そのコードでいいですね。 回答も変更しておきます。
ssk

2017/05/08 10:49

ありがとうございます。 本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問