2

リースを作りました。

resources :dashboards

フォームを含む部分ファイルがあり、この部分ファイルを使用して (フォーム要素が変更されないため) 更新および作成したいと考えています。だからここに私が持っているものがあります:

コントローラ

class DashboardsController < ApplicationController
 def new     
    @dashboard = Dashboard.new
  end
end

意見

/dashboards/new.html.erb

<%= render :partial => "form", :locals => { :dashboard => @dashboard } %>

部分形式

/dashboards/_form.html.erb

<%= form_for(@dashboard) do |form| %>
.....
<% end %>

ルビーガイド

Ruby ガイドには次のように記載されています。

Article モデルはアプリケーションのユーザーが直接利用できるため、Rails で開発するためのベスト プラクティスに従って、リソースとして宣言する必要があります。RESTful リソースを扱う場合、レコードの識別に頼ると、form_for の呼び出しが大幅に簡単になります。要するに、モデル インスタンスを渡すだけで、Rails にモデル名と残りを理解させることができます。例えば:

## Creating a new article
# long-style:
form_for(@article, :url => articles_path)
# same thing, short-style (record identification gets used):
form_for(@article)

## Editing an existing article
# long-style:
form_for(@article, :url => article_path(@article), :html => { :method => "put" })
# short-style:
form_for(@article)

結果

Railsガイドに正しく従ったと思いました。@dashboard をリソースにしたからです。それをフォームに渡すだけで、アクション、メソッド、その他を処理できます。代わりに私はこれを得ています:

<form accept-charset="UTF-8" action="/dashboards" class="new_dashboard" id="new_dashboard_" method="post">

ドキュメントによると。新しいアクションを使用しているため、フォームのアクションは「/dashboards/new」にすべきではありませんか? また、/edit アクションで同じコードを使用するときに、配置するメソッドを宣言する追加のフィールドを渡す必要がありますか??

私の結果は、何があっても常に同じです。フォームは決して変わりません。

私は何を間違っていますか?

編集

これが私のルーター情報ですrake routes

GET    /dashboards(.:format)          dashboards#index
POST   /dashboards(.:format)          dashboards#create
GET    /dashboards/new(.:format)      dashboards#new
GET    /dashboards/:id/edit(.:format) dashboards#edit
GET    /dashboards/:id(.:format)      dashboards#show
PUT    /dashboards/:id(.:format)      dashboards#update
DELETE /dashboards/:id(.:format)      dashboards#destroy
4

1 に答える 1

1

@dashboard「フォームに渡して、アクション、メソッド、その他を処理させる」ことができるはずです。ここでの問題はnew、RESTful アクションのコンテキストにあるものです。

を使用して一連のリソースを宣言するとresources :dashboards、リクエストをコントローラー アクションにマップする一連のルートが作成されます。

GET     /dashboards             index
GET     /dashboards/new         new
POST    /dashboards             create
GET     /dashboards/:id         show
GET     /dashboards/:id/edit    edit
PUT     /dashboards/:id         update
DELETE  /dashboards/:id         destroy

を実行すると確認できますrake routes

ここでの問題は、アクションがパスへのリクエストnewとして定義されていることです。つまり、これはフォーム自体のルートです。実際のフォームの属性の URLは別のものです。これは、サーバー (レール) 側でコントローラーのアクションにマップされるリクエストと共にフォームがデータを送信する場所です。GET/dashboards/newactionPOSTcreate

でフォーム ヘルパーを使用すると、次form_for(dashboard)のものに対応するルートでフォームが作成されdashboardます。それが新しいレコードである場合 (つまり、データベースにまだ存在しない場合)、フォーム アクションはcreate(および を指す/dashboards) になります。一方、既に存在する場合は、レコードの実際の URL を指します (例: /dashboards/123)。これが、フォーム ヘルパーが非常に便利な理由です。

つまり、アクションではなく、新しいレコードであるためフォーム ヘルパーが使用するアクション/dashboardsの正しい URLです。フォームが存在するページへのルートです。newcreatedashboardnew/dashboards/new

それが理にかなっていることを願っています。

ps 補足@dashboardとして、ローカル ( ) として渡す場合は、部分的にアクセスしないでください:locals => { :dashboard => @dashboard }。を使用するだけdashboardです。

于 2013-01-09T03:06:38.270 に答える