是否可以通过更新操作/方法以外的操作/方法进行更新?例如,在我的用户控制器中,我已经有一个用于我的用户帐户其他部分的更新方法。
我需要一个单独的密码来更改我的用户密码。是否可以有这样的东西:
def another_method_to_update
user = User.authenticate(current_user.email, params[:current_password])
if user.update_attributes(params[:user])
login user
format.js { render :js => "window.location = '#{settings_account_path}'" }
flash[:success] = "Password updated"
else
format.js { render :form_errors }
end
end
然后我的更改密码表单知道使用该方法来执行更新吗?
有3个字段:当前密码 新密码 确认新密码
我使用ajax来显示表单错误。
亲切的问候
是的;
update
操作只是默认提供的,以使基于 REST 的界面变得非常简单。您需要确保 config/routes.rb
中有一条引用 users#another_method_to_update
的 POST 路由,假设您在 UsersController (和 Rails 3 上)中执行所有这些操作,但您问题的基本答案是模型操作(包括更新字段)可以在任何有可用模型的地方完成。
可以调用哪些模型方法和正在调用哪些控制器方法之间没有任何联系。
为什么要使用另一条路线?遵循约定,使用默认路由。如果我理解正确的话,您的页面包含一个密码更新表格。
我们可以在 update 方法中为此编写完整的代码,但这更干净且更不言自明:
def update
change_password and return if change_password?
# old code of your update method
# ...
end
private
def change_password?
!params[:current_password].nil?
end
def change_password
user = User.authenticate(current_user.email, params[:current_password])
respond_to do |format|
if user.update_attributes(params[:user])
login user
flash[:success] = "Password updated"
format.js { render :js => "window.location = '#{settings_account_path}'" }
else
format.js { render :form_errors }
end
end
end
对于查看代码的人来说,这更容易理解,因为您仍在调用 update 方法来更新模型,然后执行自定义操作。
我还修复了您的自定义方法代码。
在config/routes.rb中:
puts "users/other_update_method"
我想补充一点,除了为新的自定义更新操作(another_method_to_update)创建新路由之外,我们不要忘记更改表单助手中的 url 选项以进行编辑,以告知表单将提交到哪里。 这是有关表单助手及其选项的文档的链接。
举个例子: users_controller.rb
def another_method_to_edit
...
end
def another_method_to_update
...
end
路线:
resources :users do
get :another_method_to_edit, on: :member
patch :another_method_to_update, on: :member
put :another_method_to_update, on: :member
end
另一个_method_to_edit.html.erb:
<%= form_with(model: user, url: {action: "another_method_to_update"}) do |form| %>
...
<% end %>