Jak działa routing w szynach 4? To, co staram się osiągnąć, to takie adresy URL:
..../categories/<name of category>
kiedy obecnie otrzymam:
..../categories?utf8=✓&category=dingus
HTML to:
<%= form_tag(categories_path, :method => "get") do %>
<%= select_tag "category", options_for_select(@categories, params[:category]), {onchange: "this.form.submit();", prompt: "Select Category"} %>
<% end %>
i takie trasy:
get "/" => "<controller>#h"
get "categories" => "<controller>#categories"
Wiem, że mogę użyć gem friendly_id do stylizacjiurl z kategorii /: id do kategorii /: kategoria. Ale utknąłem na początkowym etapie zrozumienia tras. Próbowałem wielu rzeczy, ale jest to bardzo zagmatwane. Wszelkie pomysły lub sugestie będą bardzo mile widziane!
Dzięki!
Odpowiedzi:
0 dla odpowiedzi № 1Zobacz Przewodnik routingu, a konkretnie w sekcji Zasoby.
Gdybyś miał w swoim routes.rb
:
resources :categories
Możesz użyć pomocnika formularza, takiego jak:
<%= form_tag(categories_path, :method => "get") do %>
<%= select_tag "category", options_for_select(@categories.map {|c| [c.name, category_path(c)]}, params[:category]), {onchange: "window.location.href = this.value;", prompt: "Select Category"} %>
<% end %>
Jeśli w twoim Category
model, który dodałeś to_param
definicja:
class Category < ActiveRecord::Base
def to_param
name
end
end
Wtedy wszystkie Twoje adresy URL będą zgodne z Twoimi oczekiwaniami, .../categories/books
. The url_for
pomocnicy wygenerują dla Ciebie odpowiednie adresy URL:
assert category_path(@book_category) == "/categories/book"
Widzieć ActiveRecords :: Integrations # to_param dokumentacja więcej.
0 dla odpowiedzi nr 2
Nie mogłem uruchomić dokładnego rozwiązania Sama @categories
jest pochodną tablicy unikalnych kategorii w modelu Post:
@categories = Post.pluck(:category).uniq
więc przy niewielkiej zmianie działa to tak:
erb:
<%= form_tag do %>
<%= select_tag "category", options_for_select(@categories.map {|c| [c, show_category_path(c)]}, params[:category]), {onchange: "window.location.href = this.value;", prompt: "Select Category"} %>
<% end %>
routes.rb:
get "/categories/:category" => "posts#categories", as: "show_category"
kontroler
def categories
@posts = Post.where(category: params[:category])
end
Więc URL to: /categories/dingus
. Mam teraz problem z wyświetlaniem spacji jako% 20 (np. /categories/dingus%20burger
, ale to już inna sprawa i podejrzewam, że metody to_param lub url_for w tym pomogą
Ten samouczek był dla mnie bardzo pomocny, aby trochę lepiej zrozumieć trasy: https://www.youtube.com/watch?v=16Bk_0RADLQ