Как заставить действие редактирования и удаления контроллера работать - PullRequest
0 голосов
/ 06 апреля 2020

Я не могу заставить редактировать и удалять действия контроллера для работы. У меня есть почти идентичный код в другом контроллере, и это не выходит из строя.

Это форма редактирования:

<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

Я получаю сообщение об ошибке «Синатра не знает эту пустышку» :

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

Я не уверен, откуда исходит "post / users /".

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Ваша форма не работает, так как атрибут действия /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
0 голосов
/ 07 апреля 2020

Так что я исправил проблему. Я использовал этот гем под названием Corneal для запуска скаффолда необходимой файловой структуры, но в нем отсутствовала ссылка Rack :: MethodOverride в config.ru. Спасибо Макс, что указал мне правильное направление.

...