В моем приложении есть таблица «Ссылки», которая содержит, помимо прочего, страну, штат и город.
Каждый пользователь может опубликовать собственную ссылку, указав в качестве обязательных значений страну, штат и город.
Моя домашняя страница содержит список всех ссылок всех пользователей и имеет раскрывающийся список, в котором должны отображаться все страны, уже зарегистрированные в ссылках, который затем должен фильтровать записи другого раскрывающегося списка, в котором должны быть зарегистрированы все города + штаты, уже зарегистрированные ввсе ссылки в выбранной стране.
Мне удалось перечислить все отдельные города из ссылок:
<li class="dropdown">
<a href="#" class="dropdown-toggle" id="drop3" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Select city ⌄</a>
<ul class="dropdown-menu" aria-labelledby="drop3">
<% Link.select(:city).distinct(&:city).uniq do |link|%>
<li><%= link_to link.city, root_path(city: link.city), class: "btn-purple" %></li>
<% end %>
</ul>
</li>
Мой вопрос заключается в том, как составить список уникальных значений для выпадающего списка стран иОтфильтруйте этот выпадающий список.После этого я хотел бы знать, как отправить информацию в виде параметра URL-адреса для перенаправления на домашнюю страницу с отфильтрованными результатами.
Я создал маршрут к root_path
с ":city"
в качестве параметра,поэтому, следуя "localhost:3000/?city=City%20Name"
, ссылки на домашнюю страницу фильтруются по зарегистрированному городу.
РЕДАКТИРОВАТЬ
Я изменил свой вопрос, чтобы показать schema.rb и контроллер ссылок:
schema.rb links
create_table "links", force: :cascade do |t|
t.string "title"
t.string "url"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.integer "cached_votes_total", default: 0
t.integer "cached_votes_score", default: 0
t.integer "cached_votes_up", default: 0
t.integer "cached_votes_down", default: 0
t.string "image_file_name"
t.string "image_content_type"
t.integer "image_file_size"
t.datetime "image_updated_at"
t.text "description"
t.string "country"
t.string "city"
t.string "address"
t.integer "street_number"
t.string "neighborhood"
t.string "route"
t.string "administrative_area_level_1"
t.integer "postal_code"
t.index ["cached_votes_down"], name: "index_links_on_cached_votes_down"
t.index ["cached_votes_score"], name: "index_links_on_cached_votes_score"
t.index ["cached_votes_total"], name: "index_links_on_cached_votes_total"
t.index ["cached_votes_up"], name: "index_links_on_cached_votes_up"
t.index ["user_id"], name: "index_links_on_user_id"
end
links_controller.rb
class LinksController < ApplicationController
load_and_authorize_resource
before_action :set_link, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
# GET /links
# GET /links.json
def index
@links = Link.all
if params[:tag]
@links = Link.tagged_with(params[:tag])
end
if params[:city]
@links = Link.where(city: params[:city])
end
end
def new
@link = current_user.links.build
end
# POST /links
# POST /links.json
def create
@link = current_user.links.build(link_params)
@link.user_id = current_user.id
respond_to do |format|
if @link.save
format.html { redirect_to @link, notice: 'Link was successfully created.' }
format.json { render :show, status: :created, location: @link }
else
format.html { render :new }
format.json { render json: @link.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /links/1
# PATCH/PUT /links/1.json
def update
respond_to do |format|
if @link.update(link_params)
format.html { redirect_to @link, notice: 'Link was successfully updated.' }
format.json { render :show, status: :ok, location: @link }
else
format.html { render :edit }
format.json { render json: @link.errors, status: :unprocessable_entity }
end
end
end
# DELETE /links/1
# DELETE /links/1.json
def destroy
@link.destroy
respond_to do |format|
format.html { redirect_to links_url, notice: 'Link was successfully destroyed.' }
format.json { head :no_content }
end
end
def upvote
@link = Link.find(params[:id])
@link.upvote_by current_user
redirect_back fallback_location: '/'
end
def downvote
@link = Link.find(params[:id])
@link.downvote_by current_user
redirect_back fallback_location: '/'
end
def comments
@link = Link.find(params[:link_id])
@link.comments.count
end
private
# Use callbacks to share common setup or constraints between actions.
def set_link
@link = Link.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def link_params
params.require(:link).permit(:title, :url, :image, :description, :tag_list, :address, :country, :city, :route, :street_number, :neighborhood)
end
end
EDIT 2
Я редактировал несколько предыдущих абзацев.Теперь в раскрывающемся списке можно отобразить отличные значения из городов ссылок, и он перенаправит на отфильтрованную домашнюю страницу, но я хочу, чтобы города были отфильтрованы по раскрывающемуся списку стран.