<%= link_to '类型', resources_path(:resourcetype_id => params[:search_id]) %>
这个不对!
换成这个 <%= link_to '类型', resources_path(:resourcetype_id => 2) %>
,参数 2 就到控制器了!
# GET /resources
# GET /resources.json
def index
unless params[:resourcetype_id].blank?
@resources = Resource.where(resourcetype: params[:resourcetype_id])
else
@resources = Resource.all
end
end
我用的是 index 方法
如果改成 submit,要加一个 search 方法
def search
# params.require(:resource).permit(:resourcetype_id)
@resources = Resource.where(resourcetype: params[:search_id])
render :index
# @resources = Resource.where(params[:resourcetype])
end
但是前台这样写也不行?
<%= form_tag("/resources/search", method: "get") do %>
<%= label_tag(:search_id, "Search for:") %>
<%= text_field_tag(:search_id) %>
<%= submit_tag("search") %>
<%= link_to '搜索', search_resources_path(:resourcetype_id => params[:search_id]) %>
<%= link_to '类型', resources_path(:resourcetype_id => 2) %>
<% end %>
用这个 submit button 可以了! 方法中 params[:search_id] 可以取到值了? 但是我的问题是如何在页面中取到控件值,在不写 js 的情况下?
如果不会的话,建议使用最简单的 HTML
<form action="/resources/search" method="GET">
Search For: <input name="search_id" value="<%= params[:search_id] %> />
类型: <select name="resourcetype_id">
<option value="2" <%= "selected" if params[:resourcetype_id] == "2" %>>2</option>
</select>
<button type="submit">搜索</button>
</form>
然后就是 Rails 不是万能药,别以为你用了 Rails,基础的 HTML / JavaScript 就不需要了,做这些事情的时候你该用什么用什么,别什么都依赖 Rails
两位大大轮番指导了,感觉你还没懂的样子,然我来给你扫个盲:
核心的问题是:你没有弄明白哪些动作是在服务器上由 Rails 执行的,哪些动作是由浏览器执行的
Rails 再厉害,它也不能跑在用户的浏览器里,所以到了客户端上,还是得按 HTML + JavaScript 的套路来
比如,你的这段代码:
<%= form_tag("/resources/search", method: "get") do %>
<%= label_tag(:search_id, "Search for:") %>
<%= text_field_tag(:search_id) %>
<%= submit_tag("search") %>
<!-- 到这里是没有问题的,如果你点 search 你会在 search 的 get 请求里收到你提交的 search_id,用 params[:search_id] 可以取到,而帮你完成取值的是 HTML form 的默认行为 -->
<%= link_to '搜索', search_resources_path(:resourcetype_id => params[:search_id]) %>
<!-- 这个就,呃…… 这个 a 标签的生成是在服务器渲染时完成的,params[:search_id] 取的是渲染页面时控制器里的 params[:search_id],跟你的表单没有一分钱的关系,不会因为你改了输入框的值这里就跟着变了,而且你应该在 search 方法里用 params[:resourcetype_id] 来取值吧 -->
<%= link_to '类型', resources_path(:resourcetype_id => 2) %>
<!-- 这个写死,并不知道有什么毛病 -->
<% end %>
<%= form_tag(resources_path, method: :get) do %>
<%= label_tag(:resourcetype_id, "Search for:") %>
<%= text_field_tag(:resourcetype_id) %>
<%= submit_tag("类型") %>
<% end %>
这样写就不需要你加 search 方法了,改改 submit 按钮的样式,应该是你最想要的方案(如果我没理解错你想要什么)