2016-01-23 3 views
1

Мы пытаемся настроить маршруты рельсов с параметрами, разделенными больше, чем просто символами прямой косой черты.Rails 4 Параметры маршрута, определяемые ключевыми словами

В качестве примера:

someexample.com/SOME-ITEM-for-sale/SOME-PLACE 

Для следующего пути, который мы хотели бы, чтобы извлечь какие-позиционную, а некоторые на место строки в качестве параметров во время определения, какой контроллер, чтобы запустить все это против с «-for- продажа/"часть.

Я играл с вариациями на конструкциях :constraints => {:item => /[^\/]+/}, но без каких-либо успехов. Я ищу подходящее место? Благодаря!

UPDATE

В конце концов я пошел с этим решением:

get ':type/*place' => 'places#index', as: :place , :constraints => {:type => /[^\/]+-for-sale/} 

А потом восстановила полный "НЕМНОГО-ITEM для продажи" жала для разбора в контроллере, используя

params[:type] 

Надеюсь, что кто-то поможет!

+0

Если вы используете приложение Rails через Nginx, вы пробовали Nginx переписывать URL-адрес, чтобы не менять какие-либо изменения, как Rails обрабатывает URL-адреса? – Anatoly

+1

Кажется, что ограничения должны работать в этом случае. Вы хотите опубликовать код маршрута с ограничениями, которые вы пробовали, и результатами, которые он дал вам? – Elvn

+0

Спасибо Валу, немного поиграв, я получил это, чтобы работать для меня - просто нужно было проверить, что я искал в нужном месте! - обновляя свой вопрос тем, что я использовал ... – user1051849

ответ

0

В конце концов мы пошли с этим решением:

get ':type/*place' => 'places#index', as: :place , :constraints => {:type => /[^\/]+-for-sale/} 

Команда маршрутизатора только активируется, если: параметр типа содержит «-для-продажи» в строке

А потом выздоровел полные «НЕКОТОРЫЕ-ITEM для продажи» жала для разбора в контроллере, используя

params[:type] 

Надежда, что помогает кто-то!

1

friendly_id является то, что вы хотите:


#Gemfile 
gem 'friendly_id', '~> 5.1.0' 

$ rails generate friendly_id 
$ rails generate scaffold item name:string slug:string:uniq 
$ rake db:migrate 

#app/models/item.rb 
class Item < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, use: [:slugged, :finders] 
end 

выше даст вам slug колонку, которая FriendlyId будет искать любые запросы, отправленные в приложение:

#config/routes.rb 
resources :items, path: "" do 
    resources :places, path: "" #-> url.com/:item_id/:id 
end 

Хотя параметры будут по-прежнему id (если вы не используете param option из resources, но FriendlyId перекроет как ваши маршруты и модель использовать slug вместо:

<%= link_to "Item Place", items_place_path(@item, @place) %> #-> url.com/item-name-information/place-name-information 

Update

Если вы хотите иметь «динамический» структуру маршрутизации, вы будете иметь возможность использовать следующее (для этого требуется history модуль FriendlyId):

#config/routes.rb 
#... 
get '/:item_id/:place_id', to: SlugDispatcher.new(self), as: :item #-> this has to go at the bottom 

#lib/slug_dispatcher.rb 
class SlugDispatcher 

    #http://blog.arkency.com/2014/01/short-urls-for-every-route-in-your-rails-app/ 
    ########################################## 

    #Init 
    def initialize(router) 
    @router = router 
    end 

    #Env 
    def call(env) 
    id  = env["action_dispatch.request.path_parameters"][:item_id] 
    slug = Slug.find_by slug: id 
    if slug 
     strategy(slug).call(@router, env) 
    else 
     raise ActiveRecord::RecordNotFound 
    end 
    end 

    ########################################## 

    private 

    #Strategy 
    def strategy(url) 
    Render.new(url) 
    end 

    #################### 

    #Render 
    class Render 

    def initialize(url) 
     @url = url 
    end 

    def call(router, env) 
     item  = @url.sluggable_type.constantize.find @url.sluggable_id 
     controller = (@url.sluggable_type.downcase.pluralize + "_controller").classify.constantize 
     action  = "show" 
     controller.action(action).call(env) 
    end 

    end 

    #################### 

end 

Это не сработает (мы еще не адаптировали его для вложенных маршрутов), но предоставим вам возможность маршрутизации на соответствующие контроллеры.

+0

hmm - with someexample.com/SOME-ITEM-for-sale/SOME-PLACE, как бы я мог сказать маршрутизатору указать на контроллере «-for-sale» а не, скажем, контроллер «нанимать» в someexample.com/SOME-ITEM-for-hire/SOME-PLACE? – user1051849

+0

Просто используйте пользовательское ограничение для поиска контроллера для записи и перенаправления на него. Мы сделали что-то подобное (я обновлю) –

+0

благодаря Rich - это звучит как вещь. Я буду ждать вашего обновления с интересом ... – user1051849

Смежные вопросы