轨道:标签的搜索表单



我在我的网络应用程序中构建了一个简单的标记系统(我遵循了以下步骤:http://www.sitepoint.com/tagging-scratch-rails/)

所以,现在人们可以点击标签,例如狗,他们会"app.com/search/dogs"

,这工作正常。

但是,现在人们还应该使用表单输入字段搜索标签。目前我已经尝试过这个:

<%= form_tag('search', method: 'get', controller: 'static', action: 'home') do %>
  <%= text_field_tag :tag, params[:tag], placeholder: "Search Posts" %>
  <%= submit_tag("Search") %>
<% end %>

这会将用户带到:"app.com/search/?utf8=✓&tag=Dogs&commit=Search",这是行不通的。有没有办法实现其他逻辑?

这里有一些(也许)有趣的代码示例:

路线.rb

# search by tags
get 'search/:tag', to: 'static#home', as: "search"

后.rb

def self.tagged_with(name)
Tag.find_by_name!(name).posts
end

static_controller.rb

def home
  if params[:tag]
    @posts = Post.tagged_with(params[:tag])
  else
    @posts = Post.all
  end
end

posts_helper.rb

def tag_links(tags)
  tags.split(",").map{|tag| link_to tag.strip, search_path(tag.strip) }.join(" ")
end

对不起,我是一个真正的初学者:)提前谢谢你!

让我先做一个注释。form_tag不采用controlleraction参数。现在,它们只是打印为表单HTML标签属性。

<%= form_tag('search', method: 'get', controller: 'static', action: 'home') do %>
# Generates
<form controller="static" action="search" accept-charset="UTF-8" method="get">

您可能打算执行以下操作:

<%= form_tag('search', method: 'get') do %>

现在,回到你的问题。基本上,您希望动态设置表单的action属性。这只有在使用一些javascript时才有可能。

向搜索表单代码添加类:

<%= form_tag('search', method: 'get', class: 'tag-search-form') do %>

将此 JavaScript 代码添加到您的页面:

$(document).ready(function(){
  $('.tag-search-form').submit(function(e){
    var new_action_url = $(this).attr('action') + "/" + $('#tag', this).val();
    $(this).attr('action', new_action_url)
  });
});

这会将用户发送到search/{tag-field-value} URL。但是,它也会将所有参数添加到其中(search/test?utf8=✓&tag=test&commit=Search)。如果您不想要它们,则必须在发送或将表单的method属性设置为 POST 之前在 javascript 中删除它们。

最新更新