[解決済み] Ruby on Railsでsimple_formを使うさまざまな方法|何が違うの?
質問
パックの編集フォームの宛先には、以下の方法がありますが、どのような違いがあるのでしょうか?
これらの異なるアプローチは、アプリケーションの安定性にどのような影響を与えるのでしょうか?また、汎用性はありますか?
これらはどこで大きな問題になるのでしょうか?なぜ一方が他方より優れているのでしょうか?
-
Via "method?"。
<%= simple_form_for Pack.find(params[:id]), method: :patch do |f| %>
-
オブジェクト経由
<%= simple_form_for @pack, url: pack_path(@pack), method: :patch do |f| %>
-
シンボル経由
<%= simple_form_for :pack, url: pack_path(@pack), method: :patch do |f| %>
どんな情報でも結構です!是非教えてください。
解決方法は?
1. と 2. - フォームヘルパーをモデルインスタンスにバインドする
2. では、メソッド呼び出しの戻り値を渡す代わりに、インスタンス変数からモデルインスタンスを参照しているという事実を除けば、基本的に同じです。
最終的には、モデルインスタンスにバインドされたフォームを得ることができます。これは、入力のvalue属性にモデルの値が含まれることを意味します。
実際、これらはすべて同じ結果になります。
<%
@pack = Pack.find(params[:id])
pack = Pack.find(params[:id])
%>
<%= simple_form_for Pack.find(params[:id]), method: :patch do |f| %>
<%= simple_form_for @pack |f| %>
<%= simple_form_for pack |f| %>
しかし、ビューから直接クエリを実行することは避けるべきですので、最初の方法はあまり好ましくありません。ビューはコントローラからデータを受け取り、それを使ってHTMLを作成し、できるだけシンプルで宣言的であるべきです。もうひとつの大きな問題は
.find
は
ActiveRecord::RecordNotFoundError
が無効である場合、コントローラ内でもっと早く発見されるはずでした。
3. フォームヘルパーをシンボルで呼び出す。
<%= simple_form_for :pack, url: pack_path(@pack), method: :patch do |f| %>
これは、特定のモデルインスタンスに必ずしもバインドされることなく、quot;scoped"されたフォームを作成します。この例を見てみましょう。
<%= simple_form_for :thing do |f| %>
<%= f.input :name %>
<% end %>
これにより、以下のようなHTMLが生成される。
<form novalidate="novalidate" class="simple_form thing" action="/things/new" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓" /><input type="hidden" name="authenticity_token" value="F4r1gLuboZc1CKIdn9qac0sefxSVIvkjxk9KsD+sRl1wnVtEIKzHvWY0mPuLPvHI1Kcv3TIWD883YXHKXA+yJQ==" />
<div class="input string required thing_name">
<label class="string required" for="thing_name"><abbr title="required">*</abbr> Name</label>
<input class="string required" type="text" name="thing[name]" id="thing_name" />
</div>
</form>
備考
name="thing[name]"
これは、モデルインスタンスがある場合と同じように params ハッシュを与えることを意味します。
{
thing: {
name: "foo"
}
}
ほとんどの場合、モデルのインスタンスを操作することになるので、これはあまり一般的には使われませんが(少なくとも正しくありません)、検索フォームのような特殊なケースでは使い道があります。
Rails はローカル変数
@thing
が、nil の場合はエラーを発生させません。この形式はエラーを隠蔽する可能性があるため、一般的にはお勧めできません。
この挙動を理解する最善の方法は ActionView::FormHelpers これは SimpleForm がその上の砂糖に過ぎません。
関連
-
[解決済み】Rails。Ruby on Railsの移行でデータベースカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby:Rubyの配列にinclude.の反対はある?
-
[解決済み] rspecにおけるassignsの意味
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Ruby on RailsでJSON出力を "きれい "にフォーマットする方法
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み] Rubyのincludeとrequireの違いは何ですか?
-
[解決済み] RailsのERBにおける<%、<%=、<%#、-%>の違いは何ですか?
-
[解決済み】Railsの認証トークンを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Rails: sudo "コマンドが認識されないのはなぜですか?
-
[解決済み】gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み】bcrypt LoadError: Cannot load such file
-
[解決済み】OS X Yosemite 10.10.5 で [Ruby on Rails] 5 をインストールすると extconf が失敗して終了コード 1 エラーになる。
-
[解決済み] AWS S3です。アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレスされている必要があります。
-
[解決済み] heroku push rejected, failed to compile Ruby/rails app
-
[解決済み] Rails ExecJS::ProgramError in Pages#home?
-
[解決済み] rails erb フォームヘルパー options_for_select :selected
-
[解決済み] Herokuの問題 : あなたが探しているページは存在しません。
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある