ActiveRecord :: RecordNotFound (Не удалось найти запрос без идентификатора) ошибка при попытке передать параметры в контроллер из нажатия кнопки - PullRequest
1 голос
/ 20 марта 2019

Редактировать: я закончил переименовывать все запросы на назначения в проекте, и в результате возникли некоторые проблемы.Я вернусь сюда с обновлением позже, после того, как разберусь с этими проблемами, сейчас просто нужно сделать перерыв.Спасибо за помощь.

Простой вопрос, я довольно новичок в Rails на Ruby и с трудом понимаю, как работает маршрутизация.Версия 5.1.1.2.

Я хочу, чтобы кнопка создала новый объект Active Record, когда пользователь нажимает кнопку, чтобы подтвердить, что он / она принял запрос.Я пытаюсь сделать так, чтобы кнопка посмотрела текущий запрос по его идентификатору, а затем создала новую запись контракта, используя этот идентификатор в качестве внешнего ключа.Я продолжаю получать сообщение об ошибке ActiveRecord NotFound и подозреваю, что код в router.rb и кнопка неправильные.Я протестировал сами модели, и они работают в консоли rails, запустив user.accept (запрос) и user.decline (запрос), который находится в user.rb.Проблема пытается заставить кнопку выполнить то же действие.

частичное для _accept button

<%= form_with model: current_user.active_contracts.build, local: true do |f| %>
  <div><%= hidden_field :request_id, @request %></div>
  <%= f.submit "Accept", class: "btn btn-primary" %>
<% end %>

rout.rb

Rails.application.routes.draw do
  root 'pages#home'

    devise_for :users,
                    path: '',
            path_names: {sign_in: 'login', sign_out: 'logout', edit: 'profile', sign_up: 'registration'},
            controllers: {omniauth_callbacks: 'omniauth_callbacks', registrations: 'registrations'}

  resources :users
  resources :contracts, only: [:create, :destroy]
  resources :requests, except: [:edit] do
    member do
      get 'title'
      get 'dateandtime'
      get 'description'
      get 'location'
    end
  end

end

contract_controller.rb

  def create
    @request = Request.find(params[:id])
    current_user.accept(request)
    redirect_to request
  end

  def destroy
    @request = Request.find(params[:id]).accepted
    current_user.decline(request)
    redirect_to request
  end

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Это не роутер;это код вашего контроллера.

Назовите вашу переменную как-нибудь иначе - метод request будет извлекать из ActionDispatch и будет возвращать полный HTTP-запрос, обогащенный стеком, который передал его вашему контроллеру,Вот почему вам нужно как минимум изменить current_user.accept(request) на current_user.accept(@request) - ruby ​​не собирается автоматически генерировать псевдоним метода доступа для вашей переменной экземпляра.

Тем не менее, я настоятельно рекомендуювам следует избегать использования request или @request в контроллере, поскольку это фактически зарезервированные слова.Вы бы, по крайней мере, скрывали некоторую магию, которая скрыта за кулисами, и это неизбежно приведет к тому, что в будущем будет еще сложнее отлаживать проблему с областями видимости.Имена, такие как pending_request или contract_request или аналогичные, будут проще и не будут конфликтовать.Если бы вы использовали contract_request в качестве имени, вы бы написали что-то вроде этого:

def create
   @contract_request = Request.find(params[:id])
   current_user.accept(@contract_request)
   redirect_to @contract_request
 end

 def destroy
   @contract_request = Request.find(params[:id]).accepted
   current_user.decline(@contract_request)
   redirect_to @contract_request
 end

Что произойдет, если нет других ошибок, и вы обновили переменные, чтобы они соответствовали представлению, и так, исправьте свою проблему.

0 голосов
/ 20 марта 2019

Не уверен, что запрос, но, возможно, вам нужно изменить:

current_user.accept(request) -> @current_user.accept(@request)

В противном случае вы должны 1. убедиться, что вы действительно получаете правильный идентификатор параметра, распечатав параметры в методе create.puts(params.inspect)

Затем вы также можете распечатать свои запросы с помощью puts(Request.all.inspect), чтобы показать вам, что вы действительно создали запрос, который вы ищете, и он соответствует вашему идентификатору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...