我正在尝试在表单之间传递变量,但不幸的是我没能做到。
在我的
index.html.erb
中,我有一个名为SearchInput
的文本字段,我想将此变量传递到下一个表单search.html.erb
,以便我可以相应地填充一些数据。请问我该怎么办?
在我的
index.html.erb
中,我有以下内容:
<% form_tag (:action => 'search') do %>
我真的不知道如何解决这个问题,任何提示将不胜感激。
听起来您可以从阅读 Rails 等 MVC 框架中模型、视图和控制器之间的交互中受益。我建议官方入门指南
以下是与您的问题相关的相关详细信息:
当收到 HTTP 请求时,Rails 会根据 url 路径将请求路由到控制器操作。然后,控制器通过评估请求上下文中的视图模板来构建适当的响应。 Rails 中的标准流程是控制器从 params 哈希中提取信息,以查询数据库以获取构建视图所需的信息。在此操作期间,控制器中设置的实例值(名称以“@”开头的变量)将可供该控制器呈现的视图使用。
一般的表单,当单击提交按钮时,指示客户端的 Web 浏览器向指定的 url 发送 POST 请求。此请求包含表单的字段及其值作为标头中的数据。
Rails 解释表单数据和 params 哈希中的任何其他参数。您可以在控制器或视图中访问任何操作。访问 params 哈希值的普遍接受的位置是在控制器中。
让我们回顾一下实际发生的过程。以下是在开发中运行服务器的情况,假设我们正在讨论产品的控制器,并且您已经正确设置了路由。
用户在地址栏中输入 http://localhost:3000/products 以发起 GET 请求。
Rails 将此请求路由到产品控制器的索引操作。
Rails 将执行 ProductsController#index (index 方法位于 app/controllers/products_controller.rb 中)
除非您显式渲染或重定向请求,Rails 将渲染产品/索引模板 (app/views/products/index.html.erb),其中包含一个提交给 ProductsController 的搜索操作的小表单。表单代码将如下所示:
<% form_tag(:action => 'search') do %>
<%= text_field_tag "SearchInput" %>
<%= submit_tag %>
<% end %>
用户填写 SearchInput 字段并将表单作为 POST 请求提交到 http://localhost:3000/products/search
Rails 将此请求路由到产品控制器的搜索操作。
Rails 执行 ProductsController#search,params 哈希包含用户使用 SearchInput 键在 SearchInput 字段中输入的值。这是一个使用表单输入执行搜索的非常简单的示例。
def search
@products = Product.find_by_name(params["SearchInput"])
end
除非您明确呈现或重定向请求,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 %>
表单数据作为
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
以下是如何通过 link_to 方法传递参数,以便转到另一个表单,以便使用传递的参数创建一个新对象。该策略将允许您在控制器中的操作之间传递变量并创建具有预定义属性的对象:
假设您有一个名为 @foo 的变量,您想要将其传递给 new 控制器操作,并且您的 new 视图包含一个供用户填写的表单。在这种情况下,你可以使用
<%= link_to "Link Text", new_widget_path(:foo => @foo) %>
它将 @foo 存储在 params[:foo] 中,允许您在控制器中使用 params[:foo]。
单击 Link Text 会将 Rails 定向到 WidgetController 的 new 操作。你可以拥有
def new
@widget = Widget.new(:foo => params[:foo])
end
这将定义一个新的 Widget 对象,其 :foo 属性预先填充了 params[:foo]。
然后,在您的 new.html.erb 视图文件中,您可以允许用户使用已通过隐藏表单字段填写的预定义 foo 属性创建一个新的 Widget 对象:
<%= 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 属性已填写!