如何使用 ruby on Rails 中的替代更新方法来更新我的方法?

问题描述 投票:0回答:4

是否可以通过更新操作/方法以外的操作/方法进行更新?例如,在我的用户控制器中,我已经有一个用于我的用户帐户其他部分的更新方法。

我需要一个单独的密码来更改我的用户密码。是否可以有这样的东西:

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来显示表单错误。

亲切的问候

ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1
4个回答
0
投票

是的;

update
操作只是默认提供的,以使基于 REST 的界面变得非常简单。您需要确保
config/routes.rb
中有一条引用
users#another_method_to_update
的 POST 路由,假设您在 UsersController (和 Rails 3 上)中执行所有这些操作,但您问题的基本答案是模型操作(包括更新字段)可以在任何有可用模型的地方完成。

可以调用哪些模型方法和正在调用哪些控制器方法之间没有任何联系。


0
投票

为什么要使用另一条路线?遵循约定,使用默认路由。如果我理解正确的话,您的页面包含一个密码更新表格。

我们可以在 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 方法来更新模型,然后执行自定义操作。

我还修复了您的自定义方法代码。


0
投票

在config/routes.rb中:

puts "users/other_update_method"

0
投票

我想补充一点,除了为新的自定义更新操作(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 %>
© www.soinside.com 2019 - 2024. All rights reserved.