Rails POST表单到漂亮的URL

时间:2011-08-07 03:51:19

标签: ruby-on-rails-3 routes rails-routing

有一个'我显然做错了'的时刻。感觉我正在尝试做一些基本的事情,并与框架作斗争,所以我很有吸引力寻求帮助!

我正在使用Rails 3,并且对于如何制作一个能够生成网页干净的搜索表单感到有点困惑。

我的应用程序允许您从任何位置搜索路线到另一个位置。

例如,有效的URL将是/ routes / A / to / B /或/ routes / B

我的routes.rb:

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时,该应用程序可以运行,但该网址很可怕。当然,对于:method => 'post',变量不再可见,这对于书签来说是不好的。如何在发布表单后告诉Rails使用我漂亮的URL?

我在Rails非常新,所以请耐心等待。

1 个答案:

答案 0 :(得分:5)

您可以通过键入rake routes为您的路线指定一个自动命名路径。例如:

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

您可以使用new_flag_pathnew_flag_url

来引用该路径

您的form_tag条目有点棘手。您也可以使用find方法,而不是使用单独的index方法,但这是您的选择。

您可能会发现使用标准redirect_to根据输入重定向到更漂亮的网址会更容易。如果您不想重定向,那么您将需要使用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