Как я могу переопределить метод (PUT vs GET) в помощниках маршрута rails?

Итак, я столкнулся с этой проблемой с областями маршрутов и form_for: form_for и областями, рельсами 3

Моя проблема еще хуже, поскольку я не просто хочу охватить все методы, я хочу, чтобы все они находились под «/admin», кроме GET/show.

Итак, мой route.rb имеет что-то вроде этого:

scope '/admin' do
  resources 'lessons', except: [:show]
end
get "lessons/:id" => "lessons#show", :as => "lesson"

Запуск рейк-маршрутов на самом деле показывает, что я хочу, когда обе версии урока_пути различаются только методом PUT и GET. Итак, решение, которое предлагают другие, где вы делаете что-то вроде этого:

url = @lesson.persisted? ? lesson_path(@lesson) :  lessons_path
form_for @lesson, url: url do

У меня это не работает, потому что Lesson_path(@lesson) всегда будет возвращать путь GET, который не имеет префикса /admin, который все еще нарушает мою форму.

Так что я не могу понять, могу ли я указать метод в помощнике пути рельсов, чтобы он использовал маршрут, начинающийся с /admin? Или есть совершенно другой способ добиться этого? Я знаю, что мог бы сдаться и просто устранить неоднозначность, изменив:

get "lessons/:id" => "lessons#show", :as => "lesson"

to

get "lessons/:id" => "lessons#show", :as => "show_lesson"

но на данный момент мне просто любопытно узнать, возможно ли это, и если да, то каков «правильный» способ.


person eagspoo    schedule 24.01.2013    source источник
comment
кстати, в настоящее время у меня это работает, просто добавляя префикс URL-адреса, который я генерирую в случае PUT, с префиксом «/admin», что определенно является дрянным решением.   -  person eagspoo    schedule 25.01.2013


Ответы (1)


Я думаю, вы ищете этот синтаксис:

<%= form_for [:admin, @lesson] do |f| %>
  # form goes here
<% end %>

Это создаст помощник полиморфного маршрута с именем admin_lesson_path, если @lesson является persisted?, или admin_lessons_path, если это не так. Помощнику admin_lesson_path будет передан объект @lesson, так что маршрут будет примерно таким, как admin/lessons/1. admin_lessons_path будет генерировать /admin/lessons. Затем форма будет знать, следует ли использовать POST или PUT в зависимости от того, сохраняется ли запись или нет.

Вы можете определить справку по маршрутизации в файле маршрутов следующим образом:

 namespace :admin do
   resources :lessons
 end

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

 module Admin
   class LessonsController < BaseController 

   end
 end

И тогда BaseController будет содержать логику (как before_filter) для ограничения того, может ли пользователь выполнять действия в этом контроллере.

Поместив все свои административные ресурсы в эти контроллеры с пространством имен, вы сохраните все действия администратора в одном месте, а все действия, связанные с пользователем, — в другом. Если вы слышали о «разделении интересов», то это хороший случай.

person Ryan Bigg    schedule 25.01.2013