LINUX.ORG.RU

RoR генерация адресов хелперами _path

 , ,


0

1

В роутах

scope '(/:key)' do
	get 'test1' => 'welcome#index', as: 'test1'
end
При попытке зайти на /key1/test1 все работает в парам передается key => 'key1'
При попытке зайти на /test1 все работает в парам передается key => nil
Проблема в том что test1_path при любом варианте захода генерирует адрес /test1, а нужно что бы при передче параметра key => 'key1' генерировал /key1/test1 а при key => nil генерировал /test1, можно конечно везде писать test1_path(params), тогда все работает как надо, но это не удобно.
Как сделать правильно?

★★★★★

Ответ на: комментарий от Apple-ch

Написать кастомный хелпер.

Хелперов много, и проще тогда уж к каждому параметры добавить чем переписывать их все. Или я тебя не правильно понял.

TDrive ★★★★★ ()

В общем лор совсем уже не торт, а моя проблема решается в 5 строчек.
Смысл в том что бы переопределить необходимые хелперы дописав к ним передачу параметра :key.
Переопределять хелперы нужно после того как отработают роуты по этому код переопределения записывается в конце файла роутов
Сам код вот

module ApplicationHelper
	Rails.application.routes.routes.select{|r| r.name && r.parts.first == :key}.map(&:name).each do |name|
		define_method(:"#{name}_path"){|hash = {}| super(hash.merge(key: params[:key]))}
	end
end
module ApplicationHelper - что бы новые хелперы были доступны во вьюшках, возможно есть более удачное место но это первое пришло в голову

Rails.application.routes.routes - сет со всеми роутами из которого нам нужно выбрать названия хелперов

select{|r| r.name && r.parts.first == :key}.map(&:name) - выбираем названия нужных нам хелперов в массив, в данном случае проверка на то что название в принципе есть у роута + параметры роута начинаются с :key (как в исходной задаче)

Дальше перебираем массив с названиями роутов добавляя _path и определяем их как методы, внутри метода вызываем super (оригинальный метод) добавляя в параметры key: params[:key]

Для хелперов _url соответственно можно определять второй метод после определения _path, еще возможно я накосячил с параметрами хелперов, там вроде кроме хеша может еще и массив передаваться, но это все уже тонкости, смысл должен быть понятен, может кому пригодится.

TDrive ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.