受け取ったパラメーターによって条件分岐する機能を実装する必要があったのでメモ
###状態
Wordsテーブルにcompleteカラム。
completeカラムはtrueかfalseの値が入る。
送られてくるパラメーターがtrueかfalseによってリダイレクトする場所を変えたい。
下記はword入力フォーム
<%= form_for(word) do |f| %>
<div class="d-flex flex-row pull-left">
<%= f.check_box :complete, {}, checked_value = "true", unchecked_value = "false" %>
<%= f.submit "保存", class: "btn btn-primary btn-xs" %>
</div>
<% end %>
ちなみにwords.html.erb
にはチェックボックスが未チェック状態(つまり初期がfalse)、practice.html.erb
にはチェックボックスがチェック状態(初期がtrue)。
これらを未チェック時にはチェックをして保存→wordsページ
にリダイレクト、チェック時には未チェックにして保存→practiceページ
にリダイレクトしたい。
要約すると、words=>words、practice=>practiceと同じページにリダイレクトしたい。
このフォームをコントローラーに渡す
def update
word = Word.find(params[:id])
if word.complete?
word.update_attributes(word_params)
redirect_to "/words"
else !word.complete?
word.update_attributes(word_params)
redirect_to "/practice"
end
end
end
private
def word_params
params.require(:word).permit(:english, :japanese, :complete)
end
すでに存在している値なのでupdateに送られます。
上記のコードの書き方でupdateに送られるとリダイレクトされるページが真逆になりました。
未チェック時にはチェックをして保存→completeページ
にリダイレクト、チェック時には未チェックにして保存→wordsページ
にリダイレクトされるハメに。
というのも、考えてみると
def update
word = Word.find(params[:id])
if word.complete? #=>保存する前の値がtrueつまりすでにチェック済が当てはまる。
word.update_attributes(word_params) #=>ここでチェック済から未チェックへと保存される。
redirect_to "/words" #=>チェック済ページ(practice)からwordsページへ
else !word.complete? #=>保存する前の値がfalseつまり未チェックが当てはまる。
word.update_attributes(word_params) #=>ここで未チェックからチェック済へと保存される。
redirect_to "/practice" #=>未チェックページ(words)からpracticeページへ
end
end
end
という仕組みになっていたのである(自己解釈)
この問題を解決するため、保存の動作を先に用意し、保存後の値を参照して条件分岐させるようにすると、希望通りのページへリダイレクトしてくれる。
def update
word = Word.find(params[:id])
if word.update_attributes(word_params)
if word.complete?
redirect_to "/words"
else !word.complete?
redirect_to "/practice"
end
end
end
これでできました。とりあえず調べに調べた結果がこれです。まだまだ簡単に書けるかは分かりませんが現段階の知識をメモ。