Rails:标签搜索表单
Rails: Searchform for Tags
我在我的网络应用程序中构建了一个简单的标记系统(我已按照以下步骤操作: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",但这是行不通的。有没有办法实现其他逻辑?
这里有一些(也许)有趣的代码示例:
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
对不起,我是一个真正的初学者:)提前谢谢你!
让我从一个笔记开始。 form_tag
不采用 controller
或 action
参数。现在,它们只是作为表单 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.
时才有可能
在您的搜索表单标签中添加 class:
<%= 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
)。如果您不想要它们,则必须在发送前在 javascript 中删除它们,或者将表单的 method
属性设置为 POST
.
我在我的网络应用程序中构建了一个简单的标记系统(我已按照以下步骤操作: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",但这是行不通的。有没有办法实现其他逻辑?
这里有一些(也许)有趣的代码示例:
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
对不起,我是一个真正的初学者:)提前谢谢你!
让我从一个笔记开始。 form_tag
不采用 controller
或 action
参数。现在,它们只是作为表单 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.
在您的搜索表单标签中添加 class:
<%= 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
)。如果您不想要它们,则必须在发送前在 javascript 中删除它们,或者将表单的 method
属性设置为 POST
.