HTML/CSS 如何获取输入框控件值,放入控制器参数中,求标准语法?

tooyee · 2018年06月10日 · 最后由 IChou 回复于 2018年06月11日 · 6632 次阅读

<%= link_to '类型', resources_path(:resourcetype_id => params[:search_id]) %>

这个不对!

换成这个 <%= link_to '类型', resources_path(:resourcetype_id => 2) %>,参数 2 就到控制器了!

思路不对,把 link 改为 submit button,输入框的内容作为表单内容提交。

# 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 %>

关键是 params[:search_id] 取不到值?是不是语法不对?

用这个 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 按钮的样式,应该是你最想要的方案(如果我没理解错你想要什么)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号