Rails:搜索标签

时间:2016-04-27 13:13:36

标签: ruby-on-rails search tagging

我在我的webapp中构建了一个简单的标记系统(我已按照以下步骤操作: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 %>

这会让用户:&#34; app.com/search/?utf8 =✓&amp; tag = Dogs&amp; commit = Search&#34;那不起作用。有没有办法实现其他逻辑?

这里有一些(可能)有趣的代码示例:

的routes.rb

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

post.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

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

1 个答案:

答案 0 :(得分:1)

让我先说一下。 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}网址。但是,它也会将所有参数添加到它(search/test?utf8=✓&tag=test&commit=Search)。如果您不想要它们,则必须在发送之前将其删除,或者将表单的method属性设置为POST