1

これが私のusers/edit.html/erbにあるものです

<%= form_for(resource, :as => resource_name, :url => user_path(resource_name), :html => { :method => :put }) do |f| %>

ユーザーの私のルート:

           edit_user GET    /users/:id/edit(.:format)      users#edit
                user GET    /users/:id(.:format)           users#show
                     PUT    /users/:id(.:format)           users#update

method => puts なので、ルート情報を使用して、HTML アクションが /users/:id になることを期待しています

これは users/edit.html.erb で、from id の HTML は edit_user_id であり、class は edit_user であると予想しています。

フォームが表示されたときに、実際にHTMLで(firebugを使用して)取得しているものは次のとおりです。

<form id="new_user" class="new_user" method="post" action="/users/user" accept-charset="UTF-8">

HTML は次のようになっているべきではありません (ユーザー ID が 1 であると仮定):

<form id="edit_user_1" class="edit_user" method="post" action="/users/1" accept-charset="UTF-8">

私の routes.rb ファイルには、次のものがあります。

resources :users, only: [:show, :edit, :update]
devise_for :users, :controllers => { :registrations => 'registrations', :confirmations => 'confirmations' }, :path => '', :path_names => { :sign_in => "login", :sign_up => "request_invite" }

編集 - Viktor のコメントへの応答:

ユーザー ヘルプを次のように変更しました。

def resource
  @resource ||= User.find(params[:id])
end

したがって、API ドキュメントによると、これはアクションとして /users/:id も取得する必要があるため、HTML は次のようになります。

<form id="edit_user_1" class="edit_user" method="post" action="/users/1" accept-charset="UTF-8">

代わりに、次のとおりです。

<form id="edit_user" class="edit_user" method="post" action="/users/user" accept-charset="UTF-8">

そのため、ユーザー コントローラーが動作を開始すると、次のコードがヒットします。

def update
  @user = User.find(params[:id])

そして、(フォームのアクションから)渡すIDはユーザーという単語であると考えているため、更新をクリックすると次のエラーメッセージが表示されると予想されます。

ID=user のユーザーが見つかりませんでした

それがまさに私がエラーとして得ているものです。追加の洞察はありますか?

最終的な答え:

users_helper.rb では:

def resource
  @resource ||= User.find(params[:id])
end

および users/edit.html.erb で

resource_name, :html => { :method => :put }) do |f| %>
4

1 に答える 1

1

簡単な答えは次のとおりです。それはあなたの見解における資源の価値に依存します。

http://apidock.com/rails/v3.2.3/ActionView/Helpers/FormHelper/apply_form_for_options!フォームのIDとクラスは、dom_idヘルパーとdom_classヘルパーによって生成されます。次の場合に限り、「action」プレフィックスは「edit」であり、「new」ではありません。

object.respond_to?(:persisted?) && object.persisted?

activerecordオブジェクトの場合、オブジェクトがdbに保存されたことがある場合にのみ、これはtrueと評価されます。

于 2012-06-07T12:58:20.593 に答える