Rails POST формирует красивый URL - PullRequest
2 голосов
/ 07 августа 2011

Наличие одного из тех моментов «я явно делаю что-то не так».Такое ощущение, что я пытаюсь сделать что-то простое и борюсь с фреймворком, поэтому я обращаюсь за помощью!

Я использую Rails 3, и я немного запутался, как создать форму поиска, котораярезультаты на страницах с чистыми URL-адресами.

Мое приложение позволяет выполнять поиск по маршрутам из любого местоположения в другое местоположение.

Например, допустимым URL-адресом будет / route / A / to / B/, или / маршруты / B

Мои маршруты.рб:

match 'routes/:from/to/:to' => 'finder#find', :as => :find
match 'routes/find' => 'finder#find'

Моя форма поиска:

<% form_tag('/routes, :method => 'post') do %>
  <%= label_tag(:from, "From:") %>
  <%= text_field_tag(:from) %>
  <%= label_tag(:to, "To:") %>
  <%= text_field_tag(:to) %>
  <%= submit_tag("Go") %>
<% end %>

Контроллер:

class FinderController < ApplicationController
  def index
  end

  def find
    if params[:from].blank? or params[:to].blank?
      render :action => "invalid_results" and return
    end
    @from = Location.find_by_code(params[:from].upcase)
    @to = Location.find_by_code(params[:to].upcase)
    if @from.nil? or @to.nil?
      render :action => "invalid_results" and return
    end

    @routes = Route.find_all_by_from_location_id_and_to_location_id(@from, @to)

  end
end

Когда я использую :method => 'get' в моем form_tag, приложение работает, но URL отвратителен.И, конечно же, с :method => 'post' переменные больше не видны, что плохо для закладок.Как мне сказать Rails использовать мои красивые URL после размещения формы?

Я ОЧЕНЬ новичок в Rails, поэтому ваше терпение ценится.

1 Ответ

5 голосов
/ 07 августа 2011

Вашим маршрутам присваивается автоматический именованный путь, который вы можете увидеть, набрав rake routes. Например:

new_flag GET    /flags/new(.:format)      {:action=>"new", :controller=>"flags"}

Вы можете обратиться к пути, используя new_flag_path или new_flag_url

Ваша запись form_tag немного неуклюжая. Вместо отдельного метода find вы также можете использовать метод index, но это ваш выбор.

Возможно, вам будет проще использовать стандартный redirect_to для перенаправления на более симпатичный URL-адрес на основе входных данных. Если вы не хотите перенаправления, вам нужно использовать jQuery для динамического изменения метода действия формы. При поиске обычно используются ужасные параметры GET.

Так что я бы изменил ваш код так:

routes.rb

get 'routes/:from/to/:to' => 'finder#routes', :as => :find_from_to
post 'routes/find' => 'finder#find', :as => :find

_form.html.erb

<% form_tag find_path, :method => :post do %>
  <%= label_tag(:from, "From:") %>
  <%= text_field_tag(:from) %>
  <%= label_tag(:to, "To:") %>
  <%= text_field_tag(:to) %>
  <%= submit_tag("Go") %>
<% end %>

finder_controller.rb

class FinderController < ApplicationController
  def index
  end

  def find
    if params[:from].blank? or params[:to].blank?
      render :action => "invalid_results" and return
    end
    @from = Location.find_by_code(params[:from].upcase)
    @to = Location.find_by_code(params[:to].upcase)
    if @from.nil? or @to.nil?
      render :action => "invalid_results" and return
    end

    redirect_to find_from_to_path(@from, @to)

  end

  def routes
     @routes = Route.find_all_by_from_location_id_and_to_location_id(params[:from], params[:to])
  end
end
...