Попытка выяснить правильную маршрутизацию Rails для действия контроллера - PullRequest
0 голосов
/ 16 марта 2020
Rails 6

У меня проблема с поиском правильной маршрутизации для действия контроллера.

В моем файле controllers / Customers_controller.rb у меня есть следующее:

def extended_edit
  customer = params[:customer]
  ....
end

И, на мой взгляд, у меня есть ссылка:

td = link_to extended_edit_customer_path(id: 2, customer: customer)

В моем config / rout.rb я попытался сделать:

resources :customers do
  member do
    post :extended_edit
  end
end

Но генерируется GET вместо POST :

 Started GET "/customers/2/extended_edit?... 

И я получаю следующее сообщение об ошибке:

No route matches [GET] "/customers/2/extended_edit"  

Мои маршруты:

extended_edit_customer POST /customers/:id/extended_edit(.:format)  customers#extended_edit
customers GET    /customers(.:format) customers#index
POST   /customers(.:format) customers#create
new_customer GET    /customers/new(.:format)  customers#new
edit_customer GET    /customers/:id/edit(.:format) customers#edit
customer GET    /customers/:id(.:format)  customers#show
PATCH  /customers/:id(.:format)  customers#update
PUT    /customers/:id(.:format) customers#update
DELETE /customers/:id(.:format) customers#destroy

Я пытался сделать:

resources :customers do
  collection do
    post :extended_edit
  end
end

и изменил ссылку на:

td = link_to extended_edit_customers_path(id: 2, customer: customer)

Для соответствия новому маршруту:

extended_edit_customers POST /customers/:id/extended_edit(.:format)  customers#extended_edit

Но это приводит меня к:

Processing by CustomersController#show as HTML

Любые идеи

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Вы понимаете, что ссылки по дизайну всегда отправляют запросы GET? Так работают веб-браузеры.

Чтобы отправить запрос POST, вам необходимо отправить форму. В Rails вы можете использовать button_to для создания дискретной формы с помощью только кнопки отправки:

td = button_to extended_edit_customer_path(customer)

Это работает, даже если JavaScript отключено в браузере, так как это фактическая форма.

Вы также можете использовать Rails U JS:

td = link_to extended_edit_customer_path(customer, method: :post)

Это добавляет атрибут data-method="POST" к ссылке, которую обрабатывает драйвер Rails U JS, создавая объект формы с JavaScript и отправка его на сервер вместо обычного поведения отправки запроса GET. Если он не работает и отправляет запрос GET, то, скорее всего, у вас ошибка скрипта или в вашем пакете отсутствует Rails U JS.

Маршруты должны быть примерно такими:

resources :customers do
  member do
    post :extended_edit
  end
end

Вы также используете неправильный ключ параметра:

def extended_edit
  customer = Customer.find(params[:id])
  ....
end
0 голосов
/ 16 марта 2020

Это правильная ссылка:

td = link_to extended_edit_customer_path(id: 2, customer: customer), method: :post

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