0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

パラメーターで条件分岐

Posted at

受け取ったパラメーターによって条件分岐する機能を実装する必要があったのでメモ
###状態
Wordsテーブルにcompleteカラム。
completeカラムはtrueかfalseの値が入る。
送られてくるパラメーターがtrueかfalseによってリダイレクトする場所を変えたい。
下記はword入力フォーム

_word.html.erb
<%= 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と同じページにリダイレクトしたい。

このフォームをコントローラーに渡す

words_controller.rb
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ページにリダイレクトされるハメに。
というのも、考えてみると

words_controller.rb
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

という仕組みになっていたのである(自己解釈)
この問題を解決するため、保存の動作を先に用意し、保存後の値を参照して条件分岐させるようにすると、希望通りのページへリダイレクトしてくれる。

words_controller.rb
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

これでできました。とりあえず調べに調べた結果がこれです。まだまだ簡単に書けるかは分かりませんが現段階の知識をメモ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?