我有以下的UsersController,当我进行“编辑”操作时,我可以编辑我的数据并单击“提交”按钮。单击提交按钮后,我收到以下错误
The action 'update' could not be found for UsersController
我不明白为什么它甚至试图首先采取“更新”行动。有人能指出我正确的方向吗?
UsersController
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.create!(user_params)
redirect_to users_path, notice: "Successfully created #{@user.name}"
end
def index
@user = User.find(session[:user_id])
if @user == current_user
render :index
else
redirect_to new_session_path, notice: "You need to login first to view schedules."
end
end
def edit
@user = User.find(params[:id])
if @user == current_user
render :edit
else
redirect_to users_path, notice: "You do not have permission to edit #{@user.name}'s profile."
end
end
private
def user_params
params.require(:user).permit!
end
end
这是我的编辑视图,以及我的表单 - 帮助视图。 编辑:
<div class="page-header">
<div class="row">
<h1 class="col-sm-8" style="margin-left: 10px"><%= link_to @user.name, edit_user_path(@user) %></h1>
<div class="col-sm-3">
<span style="margin-right: 20px"><%= link_to 'Logout', 'logout', class: 'btn btn-default pull-right' %></span>
<span style="margin-right: 20px"><%= link_to 'Home', users_path, class: 'btn btn-default pull-right' %></span>
<span style="margin-right: 20px"><%= link_to 'My Studio', studios_path, class: 'btn btn-default pull-right' %></span>
</div>
</div>
</div>
<%= render partial: 'form', locals: {submit_copy: 'Edit this user'} %>
_form:
<div class="row col-sm-6" style="margin-left: 30px;">
<%= form_for @user do |f| %>
<div class="form-group">
<%= f.label :email %>
<%= f.text_field :email, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label 'Select Your Studio' %> or <%= link_to 'Add Your Studio', new_studio_path %>
<%= f.collection_select :studio_id, Studio.all, :id, :name, {}, {class: 'form-control'} %>
</div>
<div class="form-group">
<%= f.label :role, 'Role' %>
<%= f.text_field :role, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :image_url, 'Image URL' %>
<%= f.text_field :image_url, class: 'form-control' %>
</div>
<%= f.submit submit_copy, class: 'btn btn-primary' %>
or
<%= link_to 'Cancel', new_session_path %>
<% end %>
</div>
答案 0 :(得分:4)
您应该阅读一些rails基本文档,特别是rails REST的解释。
按惯例
GET
访问)PUT
)因此,在您的情况下,表单由edit
方法呈现,然后提交会将您转到update
操作。
这意味着您还必须实施它。
答案 1 :(得分:3)
由于您将@user
作为form_for
的参数传递,因此Rails会在@user
上调用#persisted?
,其中包含两种可能的结果:
true
,则表示它是正在更新的现有对象,表单将提交给#update
操作。false
,则表示它是新对象,表单将提交给#create
操作。如果您对Rails如何执行这些检查感到好奇,可以查看源代码中的ActionView模块:
更具体地说,在第1810行:
key = object ? (object.persisted? ? :update : :create) : :submit
答案 2 :(得分:2)
当您传递给form_for助手的对象已经保留时,它将创建一个用于更新对象的表单,其中包含以下属性。
<form action="/users/:id" method="post">
假设您在routes.rb文件中有默认路由
resources :users
这将生成几条静止路由,其中一条是更新资源的路由。
PATCH/PUT /users/:id users#update
然后您提交表单,将对带有表单数据的/ users /:id发送请求,并将请求路由到UsersController的更新操作。
您应该将更新方法添加到控制器并将编辑的对象保存在那里。
您可以详细了解Rails路由here。