2014-02-02 3 views
1

Хотелось бы оставить свои взгляды СУХОЙ!Решение для разных маршрутов и хранения DRY

Описание проблемы:

Я успешно реализовал AJAX нумерации страниц, однако я должен использовать статические пути в приведенном ниже примере - с помощью root_path для «нагрузок больше продуктов» ссылки. Это нормально, когда пользователь посещает корневой URL-адрес, но, очевидно, ломается при посещении a/s/[имя_пользователя] или/c/[имя коллекции]

Я не могу концептуально обернуть голову вокруг того, что мне нужно сделать для рефакторинга это? Я хотел бы сохранить маршрут/t/s/c, если это возможно.

Любые мысли?

маршруты

root_path  GET /    products#tile 
tag_view_path  GET  /t/:tag(.:format)  products#tile 
store_view_path  GET  /s/:store_slug(.:format) products#tile 
collection_view_path  GET  /c/:collection_slug(.:format) products#tile 

products_controller

def tile 

    # /t/:tag   Show all by tag 
    # /s/:store_slug  Show all by store 
    # /c/:collection_slug  Show all by collection 
    # Nothing passed  Show all by rank 

    if params[:tag] 
     # find by tag 
     # to be implemented 
    elsif params[:store_slug] 
     store = Store.friendly.find(params[:store_slug]) 
     @products = store.products.paginate(:page => params[:page]).order('rank DESC') 
     respond_to do |format| 
      format.html 
      format.js 
     end 
    elsif params[:collection_slug] 
     collection = Collection.friendly.find(params[:collection_slug]) 
     @products = collection.products.paginate(:page => params[:page]).order('rank DESC') 
     respond_to do |format| 
      format.html 
      format.js 
     end 
    else 
     @products = Product.paginate(:page => params[:page]).order('rank DESC') 
     respond_to do |format| 
      format.html 
      format.js 
     end 

    end 


end 

tile.html.erb (следующая ссылка на страницу)

<div><%= link_to 'Load More Products', root_path(:page => @products.next_page), :class => 'load-more-products', :remote => true if @products.next_page %></div> 

tile.js.erb (JS, чтобы добавить ответ Ajax)

$('.column-holder').append('<%= escape_javascript(render partial: "product", collection: @products) %>'); 
$('a.load-more-products').attr('href', '<%= root_path page: @products.next_page %>'); 

маршруты в соответствии с просьбой

# product short URL /p/slug-name-for-title 
    match 'p/:product_slug',   to: 'products#show',  via: 'get', as: 'product_view' 

    # show products by tag /t/tagname 
    match 't/:tag',     to: 'products#tile',  via: 'get', as: 'tag_view' 

    # show products by store /s/store-slug-name 
    match 's/:store_slug',   to: 'products#tile',  via: 'get', as: 'store_view' 

    # show products by collection /c/collection-slug-name 
    match 'c/:collection_slug',  to: 'products#tile',  via: 'get', as: 'collection_view' 
+0

Не могли бы вы разместите ваши маршруты? –

ответ

1

Вам необходимо пройти «где» вы на ваш взгляд, так что вы отформатируете правильно.

Я бы искал способ сделать это 3 или 4 разных метода. Краткосрочный вы можете СУХОЙ это немного как это.

# NOTE you may need to do something like 
# helper ProductHelper # to get the method from the "other file" below 
def tile 

# /t/:tag   Show all by tag 
# /s/:store_slug  Show all by store 
# /c/:collection_slug  Show all by collection 
# Nothing passed  Show all by rank 

    if params[:tag] 
     # find by tag 
     # to be implemented 
    elsif params[:store_slug] 
     store = Store.friendly.find(params[:store_slug]) 
     @products = store.products.paginate(:page => params[:page]).order('rank DESC') 
    elsif params[:collection_slug] 
     collection = Collection.friendly.find(params[:collection_slug]) 
     @products = collection.products.paginate(:page => params[:page]).order('rank DESC') 
    else 
     @products = Product.paginate(:page => params[:page]).order('rank DESC') 
    end 
    respond_to do |format| 
     format.html 
     format.js 
    end 
end 

Действительно выше есть #products_by_tag, #products_by_store, #products_by_collection и #index для всех. Это другое дело.

class ProductHelper 
    def url_for_tile_type(options = {}) 
    if params[:tag] 
     tag_view_path(options) 
    elsif params[:store_slug] 
     store_view_path(options) 
    elsif params[:collection_slug] 
     collection_view_path(options) 
    else 
     product_path(options) 
    end 
    end 
end 

Тогда ваш взгляд JS становится

$('.column-holder').append('<%= escape_javascript(render partial: "product", collection: @products) %>'); 
$('a.load-more-products').attr('href', '<%= url_for_tile_type page: @products.next_page %>'); 

Здесь мы реализовали то, что функции несколько, как polymorphic_url_for и отсылает нас к «правильной» следующей странице.

В вашем routes.rbmatch устарели в рельсах 4 Я думаю. Если вы используете рельсы 3+, вы можете это сделать.

# product short URL /p/slug-name-for-title 
    get 'p/:product_slug',   to: 'products#show',  as: 'product_view' 

    # show products by tag /t/tagname 
    get 't/:tag',     to: 'products#tile',  as: 'tag_view' 

    # show products by store /s/store-slug-name 
    get 's/:store_slug',   to: 'products#tile',  as: 'store_view' 

    # show products by collection /c/collection-slug-name 
    get 'c/:collection_slug',  to: 'products#tile',  as: 'collection_view' 
+0

Спасибо за помощь @EnabrenTane. Я посмотрю на обесценение матча. Я не вижу никаких предупреждений, но использование http-глагола имеет больше смысла. – jonoaustin

+0

Подробнее об устаревании можно найти здесь https://github.com/rails/rails/issues/5964 – EnabrenTane

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