繁体   English   中英

找不到Rails的“更新”操作

[英]Rails 'update' action not found

我有以下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'} %>

_形成:

<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' %> &nbsp;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' %>
    &nbsp;or
    <%= link_to 'Cancel', new_session_path %>
  <% end %>
</div>

您应该阅读一些rails基本文档,尤其是REST的rails说明。

按照惯例

  • edit是呈现编辑表单的操作(由GET访问)
  • update是实际更新记录的操作(由PUT访问)

因此,在您的情况下,表单是通过edit方法呈现的,然后提交会将您发送到update操作。

这意味着您也必须实现它。

由于您将@user作为form_for的参数传递,Rails将调用#persisted? @user ,可能有两个结果:

  • 如果返回值为true ,则表示它是一个正在更新的现有对象,并且该表单将提交给#update操作。
  • 如果return为false ,则表示它是一个新对象,该表单将提交给#create操作。

如果您对Rails如何执行这些检查感到好奇,可以查看源代码中的ActionView模块:

https://github.com/rails/rails/blob/4-1-stable/actionview/lib/action_view/helpers/form_helper.rb#L1808-L1824

更具体地说,在行号1810:

key    = object ? (object.persisted? ? :update : :create) : :submit

当您传递给form_for帮助器的对象已经保留时,它将创建一个具有以下属性的表单来更新该对象。

<form action="/users/:id" method="post"> 

假设您的route.rb文件中具有默认路由

resources :users

这将生成多个静态路由,其中​​之一是用于更新资源的路由。

PATCH/PUT  /users/:id  users#update

然后,您提交表单,将使用表单数据向/ users /:id发出发布请求,并且该请求将被路由以更新UsersController的操作。

您应该将更新方法添加到控制器,然后将已编辑的对象保存在那里。

您可以在此处了解有关Rails路由的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM