【问题标题】:Rails search form submit to show methodRails 搜索表单提交以显示方法
【发布时间】:2013-03-05 18:38:35
【问题描述】:

我正在尝试在 Rails 视图中设置一个表单,以将 id 提交回控制器中的 show 方法。我的表单使用自动完成来设置隐藏的 id 字段:

<%= form_tag students_path, id: 'search_student_name', method: :get do %>
  <%= text_field_tag :search_name, '', size: 30 %>
  <%= hidden_field_tag :id %>
  <%= submit_tag "Search", name: nil %>
<% end %>

我正在使用脚手架生成的标准控制器“show”方法:

# GET /students/1
# GET /students/1.json
def show
  @student = student_scope.find(params[:id])

  respond_to do |format|
    format.html # show.html.erb
    format.json { render json: @student }
  end
end

我将不胜感激有关表单 url/post 方法/其他路由组合的任何建议,以使其正常工作。这是您通常使用 Rails 的方式,还是应该设置一个新的控制器方法来处理提交的表单?

提前致谢

【问题讨论】:

  • 你能解释一下它是如何使用自动完成来填充你的用户 ID 的吗?
  • @Zippie 我在选择项目时使用 javascript 更新隐藏字段。 student.js.coffee : $('#search_student_name #search_name').autocomplete minLength: 3, source: "/students/search_name_suggestions", select: (event, ui) -&gt; $("#search_student_name #id").val ui.item.value # update what is displayed in the textbox @value = ui.item.label $('#search_student_name').submit() false

标签: ruby-on-rails search controller


【解决方案1】:

因为它不完全是一个 Restful 节目,你应该创建一个新动作,搜索。

#routes.rb
post 'search' => 'students#search'

#student_controller.rb
def search
   @student = Student.find_by_name params[:search_name]
   render action: 'show'
end

据我所知,表单不需要发送 :id。

<%= form_tag search_path, method: :get do %>
  <%= input_tag :search_name, type: 'text' %>
  <%= submit_tag "Search" %>
<% end %>

【讨论】:

  • 谢谢@cmaitchison,现在可以了。我使用 :id 是因为名称实际上是 first_name 和 last_name,并且我可以使用自动完成填充 :id 字段。我认为它会简化搜索查询并且只返回一个值(在重复名称的情况下)。再次感谢。
  • 没问题。乐意效劳。您是否知道可以将每个问题的一个答案标记为 accepted
  • 在 rails3 中:post 'search', :to =&gt; 'studnets#search'