如何使编辑和删除控制器操作起作用

How to get the edit and delete controller action to work

我无法执行编辑和删除控制器操作。我在另一个控制器中有几乎相同的代码并且不会失败。

这是编辑表单:

<form method="POST" action="/users">
  <input id="hidden" type="hidden" name="_method" value="patch">
  <div align="center">
....
    .....
  </div>
</form>

以及相关的控制器操作:

patch "/users/:id" do
    @user = User.find(params[:id])
    @user.name = params[:name]
    @user.email = params[:email]
    @user.password = params[:password]
    @user.save

    redirect to "/users/#{@user.id}"
  end

  #fix this delete request later
    delete '/users/:id' do
      @user = User.find(params[:id])
      @user.delete
      redirect '/users'
    end

我收到 "Sinatra doesn't know this ditty" 错误消息:

Try this:
# in application_controller.rb
class ApplicationController
  post '/users/' do
    "Hello World"
  end
end

我不确定 "post/users/" 的来源。

您的表单无效,因为操作属性是 /users 并且您的路线是 /users/:id

如果您已将用户传递给视图,您可以执行以下操作:

<form method="POST" action="/users/<%= @user.id %>">

但是您实际上并没有以任何体面的方式处理表单提交。接受用户输入时,您总是希望检查输入是否有效以及记录是否实际保存。如果你只是假设一切都很好,它会很快爆炸。

如果您正在使用 ActiveRecord/Mongoid,您可以这样处理:

patch "/users/:id" do
  @user = User.find(params[:id])
  if @user.update(params.slice(:name, :email, :password))
    redirect to "/users/#{@user.id}"
  else
    erb :edit # re-render the form
  end
end

所以我解决了这个问题。我正在使用这个名为 Corneal 的 gem 来基本上 运行 所需文件结构的支架,但它缺少 Rack::MethodOverride link 在 config.ru 中的使用。感谢 max 为我指明了正确的方向。