2015-08-13 2 views
0

Это похоже на простой вопрос, но я не могу найти ответ. У меня есть книги в моем приложении Rails и область для избранных книг. Я хочу конечную точку, в которой перечислены все книги, и конечная точка, в которой перечислены только избранные книги.Как создать несколько конечных точек индекса для одного контроллера Rails

У меня есть один контроллер книг API с одним действием индекса, так что site.com/api/books вернет все книги. Как сделать вторую конечную точку, которая вернет только что выпущенные книги? есть ли другой способ запроса, например/books? featured = true?

спасибо.

ответ

2

У вас есть все виды вариантов здесь, но, возможно, лучше было бы определить маршрут, как это:

get '/books(/:featured)' => 'controller#action' 

Затем в контроллере, что-то вроде:

@books = params[:featured].present? ? Book.featured : Book.all 

Это просто быстро и грязно, но, конечно же, делает трюк.

+0

yup, именно то, что я искал, спасибо! –

+0

Небольшая очистка от этого, вам не нужно называть 'present?' На 'params [: featured]'. Если не указан признанный параметр, возвращается 'nil', по умолчанию используется' Book.all'. Это также может быть выполнено с помощью предложения охраны, которое, по мнению некоторых, более чистое, чем использование тройной стенографии. – JamesDullaghan

+0

ОК, я столкнулся с проблемой с этим - в маршрутах, если у меня есть строка get/books (/: featured) 'line * above * resources: books, тогда я не могу делать книги/45, чтобы получить " шоу ". Если я скажу это ниже, книги/featured получат повторяющуюся ошибку маршрута. Могу ли я обоим? –

1

непроверенный, но должен работать.

routes.rb

get "/books(/:type)" => "books#index", as: :books 

books_controller.rb

// любопытного гибкой ситуации, вы просто бросить в "фильтре" вы хотите посмотреть. вы бросаете «признакам», и он будет искать «featured => true». если вы бросаете в «опубликовано» он ищет «опубликовано => правда»

def index 
    if params[:type].present? 
     @books = Book.where(params[:type].to_sym => true) 
    else 
     @books = Book.all 
    end 
end 

index.html.erb

<% =link_to("all books", books_path) %> 
<% =link_to("feature_books", books_path(:featured)) %> 
<% =link_to("other scoped books", books_path(:other_scope)) %> 
+0

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

+0

ничего себе ... реально? все ... все кредиты для вас - все, что вам нравится. возможно, вы видели, что я также создаю контроллер flexi для этого маршрута. до того, как у меня было довольно статично с/books или/books /: введите, где была загружена Book.where (featured). просто relaxx bro. –

+0

Я могу поддержать вас, если вам будет лучше –

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