【问题标题】:How to deal with params from form being nil? (NoMethodError)如何处理形式为零的参数? (无方法错误)
【发布时间】:2019-01-27 00:26:04
【问题描述】:

所以在我的视图顶部,我创建了一个小表单,让用户选择一个学期和一个领域:

<%= form_tag '', :method => :get do %>
          <%= collection_select(:semester, :semester_id, Semester.all, :id, :name, prompt: true) %>
          <%= collection_select(:field, :field_id, Field.all, :id, :name, prompt: true) %>
          <%= submit_tag 'Filter' %>
          <% end %>

然后页面会根据这个“过滤器”生成显示不同链接的主题。现在为此我在控制器中使用以下声明:

@betterFilteredLinks = Link.where("semester_id = #{params[:semester][:semester_id].to_i} AND field_id = #{params[:semester][:semester_id].to_i}")

如果我加载应用了过滤器的页面,这一切正常:

http://0.0.0.0:3000/?utf8=✓&semester%5Bsemester_id%5D=2&field%5Bfield_id%5D=1&commit=Filter

但是,如果我只加载http://0.0.0.0:3000/,它会(自然)将过滤器的参数设置为nil,页面将显示错误。

我想不出解决办法,也不知道该去哪里找。我读到我不应该为参数设置默认值?这可能吗?

除了使用已经预定义的参数进入视图之外,还有其他方法可以解决这个问题吗?我相信我在这里可能做错了什么,但我今天刚刚了解了表单和参数..

提前致谢:)

【问题讨论】:

  • 喜欢在不带参数的情况下输入 URL 时的“正确” 行为是什么?这不是一个技巧问题。行为可以是任何东西(明智的),但我不知道如何在不知道所需行为的情况下回答您的问题。
  • 例如,它可能是: 有意义的错误消息(不仅仅是“哎呀,出了点问题!”);或重定向到另一个页面;或者默认为某个semester_id(基于什么逻辑?);或 全部显示 - 即不按学期过滤; ...
  • 使用dig 就像params.dig(:semester, :semester_id)。但是nil.to_i 给了你0,不确定你是否想要。我不建议在 Controller 中进行过滤,也许可以创建一个名为 GradeFilter 的新类,或者给它一个合适的名称。也许根据参数是否存在来构建您的查询,例如@betterFilteredLinks = Link.order(:semester_id)@betterFilteredLinks.where(semester_id: semester_id) if semester_id,您首先必须在您的班级中设置semester_id(您可以使用dig),或将params[:semester]传递给您的新课,嗯,方法很多。
  • @TomLord 哦,是的,没有选择过滤器的正确行为应该是网站上没有显示任何内容。页面上的部分将根据选择的过滤器组合生成。例如,有人选择了第 1 学期,因此只显示有 term_id 1 的部分。因此,如果没有应用过滤器,页面将只显示标题。
  • @fanta 根据参数是否存在来构建查询正是我想要做的!我只是不知道如何用这样的话来表达!谢谢! :) 我明天要尝试挖掘并报告!

标签: html ruby-on-rails ruby forms filter


【解决方案1】:

我不太了解您的问题,但是如果您需要为 nil 或不正确的参数提供默认行为(您也应该验证),您可以在控制器中使用私有方法,从参数信息并使用 before_action 在操作中设置此对象...像这样的东西:

private
def set_full_params_data
  @full_params = {}
  params[:semester].nil? ?  @full_params[:semester_id] = DEFAULT_ID : 
                            @full_params[:semester_id] = params[:semester]
                            [:semester_id]
  ... etc
end

并添加

before_action :set_full_params_data, only: [:action_name]

在操作中使用@full_params 代替参数。

【讨论】:

  • 我明天早上会试试这个,然后回来结果!我相信这就是我一直在寻找的。问题是,如果未设置参数(因为页面已加载但尚未应用过滤器)rails 将吐出错误,因为我试图设置 params[nil][nil] 本质上。
  • 我做了一些不同的方法,并在视图中添加了if !params[:semester].nil? 行,然后再生成这些部分。这也很有效。这有安全问题吗?
  • 好吧,如果 params[:semester] 不是 nil 而是有一个不正确的值怎么办?你可能需要对只检查 null 的参数做更多的事情,并保持这个逻辑控制器是保持 MVC 分离一致的好习惯...
  • 说得好!感谢您的想法,非常感谢您的帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2021-12-22
  • 2021-09-18
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多