我试图在表单之间传递变量,不幸的是我不管理
在我的index.html.erb
中,我有一个名为SearchInput
的文本字段,我想将此变量传递给下一个表单search.html.erb
,以便我可以相应地填充一些数据。我该怎么办呢?
在我index.html.erb
我有以下内容
<% form_tag (:action => 'search') do %>
我真的很不知道如何解决这个问题,任何提示都会非常感激
答案 0 :(得分:29)
听起来你可以从像Rails这样的MVC框架中读取模型,视图和控制器之间的交互中获益。我建议官方Getting Started Guide
以下是与您的问题相关的相关详情:
当收到HTTP请求时,Rails会根据url路径将请求路由到控制器操作。控制器通过在请求的上下文中评估视图模板来构建适当的响应。 Rails中的标准流程是控制器将从params哈希中提取信息,以查询数据库以获取构建视图所需的信息。在此操作期间,控制器中设置的实例值(名称以“@”开头的变量)将可用于此控制器呈现的视图。
通常,表单指示客户端的Web浏览器在单击提交按钮时向指定的URL发送POST请求。此请求包含表单的字段及其值作为标头中的数据。
Rails解释了params哈希中的表单数据和任何其他参数。您可以在控制器中访问或查看任何操作。访问params散列的普遍接受的位置是在控制器中。
让我们逐步了解实际发生的事情。以下是在开发中运行服务器时假设我们正在谈论产品的控制器,并且您已正确设置路由。
用户将http://localhost:3000/products输入其地址栏以发起GET请求。
Rails将此请求路由到产品控制器的索引操作。
Rails将执行ProductsController #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 hash包含用户使用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 %>
答案 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 属性已经填写完毕!