2016-01-03 4 views
0

Я создаю приложение менеджера закладок, которое дает список ссылок. Каждая ссылка имеет один или несколько тегов. Я хочу дать пользователю веб-сайта возможность фильтровать ссылки по тегу. Пользователь должен иметь возможность ввести имя тега, а затем нажать кнопку «Фильтровать по тегу». Это должно содержать список только ссылок, имеющих этот тег.Как вы разбираете именованный параметр в маршрут в Синатре?

Таким образом, мой HTML форма выглядит следующим образом:

<form action='/tags/:name’ method='get'> 
    <label for='name'> 
    Tag: 
    <input type='text' name='name'> 
    </label> 
    <input type='submit' value='Filter by tag'> 
</form> 

Мой контроллер выглядит следующим образом:

class BookmarkManager < Sinatra::Base 
    get '/tags/:name’ do 
    tag = Tag.first(name: params[:name]) 
    @links = tag ? tag.links : [] 
    erb :'links/index' 
    end 
end 

Я побежал rackup и попытался отфильтровать ссылки с помощью тега. Когда я набрал и отправил имя тега, это имя было «: name», а не напечатанным текстом. В результате вместо отображения ссылок, связанных с определенным тегом, ссылки не показывались.

ответ

0

Вместо использования магического маршрута /: name, я предлагаю вам передать имя в качестве параметра queryString. Ваше приложение должно работать нормально, если изменить HTML быть таким:

<form action='/tags' method='get'> 
    <label for='name'> 
    Tag: 
    <input type='text' name='name'> 
    </label> 
    <input type='submit' value='Filter by tag'> 
</form> 

И изменить Синатра маршрут таким:

class BookmarkManager < Sinatra::Base 
    get '/tags’ do 
    raise ArgumentError, "Name is required in order to show a tag" unless params[:name] 
    tag = Tag.first(name: params[:name]) 
    @links = tag ? tag.links : [] 
    erb :'links/index' 
    end 
end 

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

+0

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

+0

Если вы хотите, чтобы ваше приложение соответствовало стандарту RESTful, тогда ваш бэкэнд должен возвращать JSON или XML, который анализируется получателем на лицевой стороне, а затем отображается в представлении. См. Https://restful-api-design.readthedocs.org/en/latest/ –

+0

Не могли бы вы принять мой ответ, так как я решил вопрос, как вы его просили (ничего не упоминалось о REST)? –

0

удалось решить эту проблему следующим образом:

В HTML:

<form action='/tags' method='get'> 
    <label for='name'> 
    Tag: 
    <input type='text' name='name'> 
    </label> 
    <input type='submit' value='Filter by tag'> 
</form> 

В контроллере:

class BookmarkManager < Sinatra::Base 
    get '/tags' do 
    redirect "/tags/#{params[:name]}" 
    end 
    get '/tags/:name' do 
    tag = Tag.first(name: params[:name]) 
    @links = tag ? tag.links : [] 
    erb :'links/index' 
    end 
end 

Так что теперь, когда я фильтр по тэгу, мой URL будет отображаться тег имя.

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