5


2

Rails3のstart_form_tagと同等のものは何ですか?

ここに初心者…​私はちょうど、これは古いレールのチュートリアルです。

フォームを作成するには、次のコードがあります。

<%= start_form_tag(:action => 'create')%>

        <%= text_field(:album, :title) %>

        <%= text_field(:album, :artist) %>

        <%= text_field(:album, :genre) %>

        <%= datetime_select(:album, :release_date) %>


        <%= submit_tag("Create") %>

    <%= end_form_tag %>

このコードの適切なRails3構文は何ですか?

ありがとう。

3 Answer


21


Rails 1以降、かなりの変化がありました。Rails3で時間を割いて違いを学ぼうとする人々に感銘を受けました(1)。 コミュニティはこれらを歓迎する必要があり、RTFM’ersは役に立ちません。 これは私が手伝うことができると思う場所です。

Rails 3で次のように書きます。

<%= form_for(@album) do |f| %>

    <%= f.label :title %>
    <%= f.text_field :title %>



    <%= f.label :artist %>
    <%= f.text_field :artist %>



    <%= f.label :genre %>
    <%= f.text_field :genre %>



    <%= f.label :release_date %>
    <%= f.datetime_select :release_date %>


  <%= f.submit %>
<% end %>

うわー、非常に多くの変更! どこから始めますか? もちろん、一番上の行!

`form_for`はしばらくRailsで使用されてきたメソッドであり、過去数回のメジャーリビジョンで非常に有用になりました。 このメソッドはコントローラーに設定された `@ album`変数を受け取り、それを検査していくつかのことを決定します1)フォームがどこに行くべきか2)フィールドの値がどうあるべきか。

この段階で、 `app / views / albums / new.html.erb`が次のようになっていることに言及する必要があります。

New Album
<%= render "form" %>

OMG、もっと新しいもの! 大丈夫です: `render" form "`は_app / views / albums / _form.html.erb_パーシャルをレンダリングします。 これは、上の `form_for`のtomfooleryが今生きるべき場所です。 Why? 説明を続けさせてください。

「AlbumsController」の「new」アクションには、次のようなものがあります。

def new
  @album = Album.new
end

「form_for」は十分に賢い:「ねえ、それは新しい「アルバム」リソースです。彼はおそらく、このフォームの「create」アクションに行きたいと思っています。それがすること。

を除いて:

これにより、 `albums_path`メソッドが定義されていないという例外が発生します。 なに?

Ruby on Rails 2では、RESTfulルーティングが_Big Thing_になりました。 http://guides.rubyonrails.org/routing.html [ルーティングガイド]を読むのがベストです。なぜなら、説明していただければ、その多くを繰り返すだけだからです。 基本的に、RESTfulルーティングはアプリケーションのURLルートの規則であり、_ / albums_へのPOST(フォームですか?)を実行すると、 `create`アクションに移動することを決定します。

しかし、Railsはこれをどのように知っていますか?

_config / routes.rb_ファイルに次の行を追加したためです。

resources :albums

これにより、コントローラーの「The Seven」デフォルトアクション(インデックス、表示、新規、作成、編集、更新、破棄)へのルートが定義されます。 真剣に、http://guides.rubyonrails.org/routing.html [ルーティングガイド]を読んで、この美しさをすべて理解してください。

それでは、小さな「form_for」に戻ります。 新しいオブジェクトのために `/ albums`にアクセスすることは知っています。 それでは、 `f`ブロック引数はどうなっていますか? さて、これはフォームビルダーオブジェクトであり、これにより、特定の「Album」オブジェクトのフォーム要素を「新しい」(そしてすぐに「編集」)アクションから構築できます。 呼び出すとき:

<%= f.text_field :title %>

Rails 1と同等のことを行っています:

<%= text_field :album, :title %>

Railsは、ビューをよりドライなものにするために、ほんの少しのシンタックスシュガーを提供します。

また、フォームにラベルを追加しました。ユーザーが入力しているフィールドを知る必要があるためです。 ここでの美しい部分は、ユーザーには :title`が表示されず、代わりに Title`が表示されることです。 `:release_date`の場合、「リリース日」が表示されます。 綺麗な。

フォームの最後で、 `f.submit`を使用します。 これにより、@ albumが新しいオブジェクトの場合は「アルバムを作成」、既存のオブジェクトの場合は「アルバムを更新」のいずれかを示す送信ボタンが生成されます。 しかし、既存のオブジェクトはどこで編集されますか?

「編集」アクションで!

def edit
  @album = Album.find(params[:id]
end

_app / views / albums / edit.html.erb_ファイルでは、_new.html.erb_兄弟とほぼ同じ内容になります。

Editing Album
<%= render "form" %>

これらの両方で* same *行を正確に使用して同じパーシャルをレンダリングできますが、オブジェクトが新しい場合、または既存の場合(一般に永続化と呼ばれる)異なる動作をします。

このパーシャルをレンダリングする edit`アクションの場合、フォームの / albums / 1`へのルートを生成し、このリソースに対してRails専用の `PUT`リクエストを実行します。 http://guides.rubyonrails.org/routing.html [ルーティングガイド]のもう1つの説明が非常にうまく説明できると思います。

この回答の長さについては申し訳ありませんが、この質問に対する短い回答はありません。かなり大きな変化ですが、「本当に」の方が良いと言うときは私を信頼してください。

Rails 3の岩。

{空}(1)そうでない人はそうではありません。


2


RAILS Stuffに関しては、2つのサイトを使用することを強くお勧めします!!!

良いニュースは…​ 両方のサイトがRails 3で更新されます!!!

はい、BBonifieldが指定したように、form_tagを使用できます


0


Micheal Hartl’s Rails Tutorialを試してみてください。RailsCasts.comは、おそらくRailsを使い始めるための最良のガイドの1つです。