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 => put,所以使用路由信息,我期望 HTML 动作是 /users/:id

这是 users/edit.html.erb,我希望来自 id 的 HTML 是 edit_user_id,类是 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" }

编辑 - 对维克多评论的回应:

我确实将用户帮助更改为:

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 中

资源名称, :html => { :method => :put }) 做 |f| %>
4

1 回答 1

1

简短的回答是:这取决于您认为资源的价值。

http://apidock.com/rails/v3.2.3/ActionView/Helpers/FormHelper/apply_form_for_options!form 的 id 和类由 dom_id 和 dom_class 助手生成,'action' 前缀是 'edit' 而不是 'new' 当且仅当:

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

对于 activerecord 对象,当且仅当该对象曾经被保存到 db 时才计算为 true。

于 2012-06-07T12:58:20.593 回答