在rails上的ruby中表单,在一个表单之间传递变量

时间:2009-11-23 01:16:16

标签: ruby-on-rails forms

我试图在表单之间传递变量,不幸的是我不管理

在我的index.html.erb中,我有一个名为SearchInput的文本字段,我想将此变量传递给下一个表单search.html.erb,以便我可以相应地填充一些数据。我该怎么办呢?

在我index.html.erb我有以下内容 <% form_tag (:action => 'search') do %>

我真的很不知道如何解决这个问题,任何提示都会非常感激

3 个答案:

答案 0 :(得分:29)

听起来你可以从像Rails这样的MVC框架中读取模型,视图和控制器之间的交互中获益。我建议官方Getting Started Guide

以下是与您的问题相关的相关详情:

当收到HTTP请求时,Rails会根据url路径将请求路由到控制器操作。控制器通过在请求的上下文中评估视图模板来构建适当的响应。 Rails中的标准流程是控制器将从params哈希中提取信息,以查询数据库以获取构建视图所需的信息。在此操作期间,控制器中设置的实例值(名称以“@”开头的变量)将可用于此控制器呈现的视图。

通常,表单指示客户端的Web浏览器在单击提交按钮时向指定的URL发送POST请求。此请求包含表单的字段及其值作为标头中的数据。

Rails解释了params哈希中的表单数据和任何其他参数。您可以在控制器中访问或查看任何操作。访问params散列的普遍接受的位置是在控制器中。

让我们逐步了解实际发生的事情。以下是在开发中运行服务器时假设我们正在谈论产品的控制器,并且您已正确设置路由。

  1. 用户将http://localhost:3000/products输入其地址栏以发起GET请求。

  2. Rails将此请求路由到产品控制器的索引操作。

  3. Rails将执行ProductsController #index(位于app / controllers / products_controller.rb中的索引方法)

  4. 除非您明确呈现或重定向请求,否则Rails将呈现产品/索引模板(app / views / products / index.html.erb),其中包含一个提交到ProductsController搜索操作的小表单。表单代码如下所示:

    <% form_tag(:action => 'search') do %>
      <%= text_field_tag "SearchInput" %>
      <%= submit_tag %>
    <% end %>
    
  5. 用户填写SearchInput字段,并将表单作为POST请求提交给http://localhost:3000/products/search

  6. Rails将此请求路由到产品控制器的搜索操作。

  7. Rails执行ProductsController #search,params hash包含用户使用SearchInput键输入SearchInput字段的值。这是使用表单输入执行搜索的一个非常简单的示例。

    def search
      @products = Product.find_by_name(params["SearchInput"])
    end
    
  8. 除非您明确呈现或重定向请求,否则Rails将呈现产品/搜索模板(app / views / products / search.html.erb)示例搜索视图:

    <% if @products.empty? %>
      No products found
    <% else %>
      <% @products.each do |product| %>
        <%= link_to product.name, product_url(product)%> 
        <br />
      <% end %>
    <% end %>
    

答案 1 :(得分:2)

表单数据作为params[..]哈希的一部分传递。因此,您可以以这种方式访问​​通过表单传递的大多数数据。

在您的情况下,您的观点

<form action="..." method="...">
  <input type=".." name="search_input" ... />
  ...
  ...
  <button>submit</button>
</form>

将通过您的控制器抓取

def action_name
  @collection = Model.find(:conditions => {:column_name => params['search_input']})
  ...
  ...
end

答案 2 :(得分:0)

以下是通过link_to方法传递参数的方法,例如,转到另一个表单以便使用传递的参数创建新对象。此策略允许您在控制器中的操作之间传递变量,并使用预定义的属性创建对象:

假设您有一个名为 @foo 的变量要传递给控制器操作,而您的视图包含一个表单供您的用户填写。在这种情况下,您可以使用

<%= link_to "Link Text", new_widget_path(:foo => @foo) %>

将@foo存储在params [:foo]中,允许你在控制器中使用params [:foo]。

单击链接文本将Rails指向WidgetController的 new 操作。你可以

def new
  @widget = Widget.new(:foo => params[:foo])
end

它将定义一个新的Widget对象,其中:foo属性预先填充了params [:foo]。

然后,在 new.html.erb 视图文件中,您可以允许用户创建一个新的Widget对象,并且已经填写了此预定义的 foo 属性通过隐藏的表单字段:

 <%= form_for(@widget) do |f| %>
  <%= f.label :other_attribute %><br />
  <%= f.text_field :other_attribute %>
  <%= f.hidden_field :foo %>
  <%= f.submit %>
<% end %>

允许用户使用自定义的other_attribute创建一个新的Widget对象,并且 foo 属性已经填写完毕!