Rails:设计 - 用户编辑不会生成我期望的HTML

时间:2012-06-07 12:20:07

标签: ruby-on-rails devise

以下是我在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 =&gt; put,所以使用路由信息,我希望HTML操作是/ users /:id

这是users / edit.html.erb,我希望来自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是单词user,所以当我点击更新时我希望得到以下错误消息:

找不到ID = user

的用户

这正是我得到的错误。任何额外的见解?

最终答案:

在users_helper.rb中:

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

并在users / edit.html.erb

中  resource_name,:html =&gt; {:method =&gt; :put})do | f | %GT;

1 个答案:

答案 0 :(得分: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。