0

Rails でデフォルトの scaffold を作成すると、 と の両方がedit.html.erb内部でnew.html.erb同じようにレンダリングさ_form.html.erbれます。どちらも、特定の類似点と相違点を持つフォームを作成します。

そのような:

  • どちらも作成<form method="post" ...>
  • 送信ボタンのテキストは異なり<input value='Create model' ..<input value='New model' ..

私の質問:

  1. 条件付きレンダリングはどのように機能しますか?
  2. フォーム要素を条件付きで表示するには? たとえば、 via で<input>呼び出された場合にのみ表示し、 viaedit.html.erbで呼び出された場合は表示しませんnew.html.erb
  3. q.2の方法が可能であれば、それは正しい方法ですか? フォームを最初から複製するのではなく、コードを再利用していますね。
4

2 に答える 2

1

RESTfulの規則に従っていると仮定すると、editとnewの違いは、フォームに渡すオブジェクトの状態に基づいています。#new_record?Railsは、新しいオブジェクトと、メソッドを使用して永続化されたオブジェクトの違いを識別できます。

Model.new.new_record? # => true
Model.first.new_record? # => false

#newコントローラのアクションでは、おそらく次のようなものがあります。

@model = Model.new

あなたの#edit行動では、おそらく次のようなものがあります:

@model = Mode.find(params[:id])

次に、この@modelオブジェクトはフォームに渡され、フォームは条件付きロジックを内部で処理します。注意すべき形式のもう1つの違いは、#editバージョンには、サーバーにPUTHTTPメソッドを使用するように指示する非表示の入力フィールドがあることです。

アップデート

Railsは実際に永続化されたものを使用しているように見えますか?new_record?ではなく内部的にメソッド違いはそれが持続したということですか?レコードが削除されたかどうかを確認します。それ以外の点では、それらは同一です(ただし反対です)

于 2012-08-23T01:14:11.227 に答える
0

あなたはそれを行うことができます:

new.html.erb では: <%= render :partial =>'form', :locals => {:action => 'new', :f => f } %>

edit.html.erb で: <%= render :partial =>'form', :locals => {:action => 'edit', :f => f } %>

_form.html.erb: if action == 'new' または if action == 'edit'

:localsなどで他のパラメータを送信することもできます:show_mobile => false

于 2012-08-23T00:53:14.387 に答える