找不到Rails'更新'操作

时间:2014-04-13 21:25:17

标签: ruby-on-rails

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

3 个答案:

答案 0 :(得分:4)

您应该阅读一些rails基本文档,特别是rails REST的解释。

按惯例

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

因此,在您的情况下,表单由edit方法呈现,然后提交会将您转到update操作。

这意味着您还必须实施它。

答案 1 :(得分:3)

由于您将@user作为form_for的参数传递,因此Rails会在@user上调用#persisted?,其中包含两种可能的结果:

  • 如果返回true,则表示它是正在更新的现有对象,表单将提交给#update操作。
  • 如果返回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

答案 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