我是rails的新手,我使用bootstrap简单表单来更新用户的信息,但它一直在调用错误的控制器。
表单代码:
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
。
我需要什么来调用正确的控制器/
答案 0 :(得分:2)
错误不是形式,而是缺乏对rails中RESTful路由如何工作的理解。
在rails约定中,您通过发送PATCH请求来更新记录。
resources :users
事实上,当你申报路线时:
UsersController
Rails为您创建该路线。请注意,名称应为复数!这同样适用于控制器UserController
而非# sugar on top of form_for
simple_form_for(@user) do |f|
。
创建表单并传递如下资源时:
<form>
Rails将查看记录并尝试根据约定查找相应的路径。您不需要指定方法,因为Rails查看模型是否已被持久化。
如果由于某些原因确实需要指定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
此外,处理更新路线的传统方法是:
{{1}}
您不希望在提交失败的表单后重定向 - 用户将丢失输入到表单中的任何数据。而是你想重新渲染表格。