【问题标题】:Rails form calling the wrong methodRails 表单调用错误的方法
【发布时间】:2016-05-08 13:18:44
【问题描述】:

我是 Rails 新手,我正在使用引导简单表单来更新用户信息,但它总是调用错误的控制器。

表格代码:

simple_form_for(@user) do |f|
= f.input :forename
= f.input :surname
.form-actions
  = f.button :submit, :method => :update

控制器中的代码:

def update
  if @user.update(user_params)
    redirect_to home_path
  else
    redirect_to wrong_path
end

路线中的代码:

resources :user do
  member do
    post :update
  end
end

但在另一个页面中,我在另一个名为AdminController 的控制器中再次使用该表单,update 表单调用AdminController 而不是UserController

我需要什么让它调用正确的控制器/

【问题讨论】:

    标签: ruby-on-rails devise haml


    【解决方案1】:

    错误不在形式上,而是对 Rails 中 RESTful 路由的工作原理缺乏了解。

    在 Rails 约定中,您通过发送 PATCH 请求来更新记录。

    PATCH /users/:id => user#update
    

    其实当你声明路由的时候:

    resources :users
    

    Rails 会为您创建这条路线。注意名字应该是复数!这同样适用于控制器UsersController 而不是UserController

    当你创建一个表单并像这样传递一个资源时:

    # sugar on top of form_for
    simple_form_for(@user) do |f|
    

    Rails 会查看记录并尝试根据约定找到对应的路线。您无需指定方法,因为 Rails 会查看模型是否已持久化。

    如果您出于某种原因确实需要在 <form> 元素上指定 HTTP 方法 - 而不是在提交按钮上。

    simple_form_for(@user, method: :patch) do |f|
    

    此外,处理更新路由的常规方法是:

    def update
      if @user.update(user_params)
        redirect_to home_path
      else
        render :edit
      end
    end
    

    您不想在表单提交失败后重定向 - 用户将丢失输入到表单中的所有数据。相反,您想重新呈现表单。

    【讨论】:

    • 这听起来很傻,但我不知道我在做什么。我必须在路由中添加PATCH 行吗?
    猜你喜欢
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多