我在我的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
对不起,我是一个真正的初学者:)提前谢谢你!
答案 0 :(得分:1)
让我先说一下。 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时才有可能。
在搜索表单标记中添加一个类:
<%= 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
。