Ruby on Rails:高级搜索,nil:Nilclass 的未定义方法 []

Posted

技术标签:

【中文标题】Ruby on Rails:高级搜索,nil:Nilclass 的未定义方法 []【英文标题】:Ruby on Rails : Advance search, undefined method [ ] for nil:Nil class 【发布时间】:2015-08-16 00:02:02 【问题描述】:

我对 Rails 非常陌生,并尝试制作一个高级搜索表单,该表单采用两个值 'blood_group' 和 'area' 并基于该搜索从数据库中获取记录并将显示在同一页面上(find. html.erb) 我在 find.html.erb 中尝试了一些东西,但是在我的搜索表单存在的地方出现错误“nil:Nil 类的未定义方法 []”。请帮助摆脱这个错误。

这是我在 find.html.erb 中的搜索表单

<%= form_tag find_path , method: :get do %>

             <p> <%= label_tag :blood_group %><br />
              <%= select_tag (:blood_group), options_for_select(%w[ A+ B+ O+ AB+ A- B- O- AB-]), params[:blood_group] %> </p>

             <p> <%= label_tag :area %><br />
              <%= select_tag (:area), options_for_select(%w[Indore Vijay_Nagar Bhawar_Kuwa Rajendra_Nagar Geeta_Bhawan Aerodram Tejaji_Nagar Raj_Mohalla Rajwada Chandan_Nagar Gandhi_Nagar Arvindo MY Bombay_Hospital]) , params[:area] %> </p> 


              <%= submit_tag "Search" , class: "btn btn-primary" , name: nil %>
            <% end %>

错误出现在我使用选择标记的行。 下面是我在 Donor 控制器中的 find 操作

def find

    @donors = Donor.search(params[:blood_group], params[:area]).all 

 end

而Donor.rb如下

class Donor < ActiveRecord::Base


def self.search(blood_group, area)

    return all unless blood_group.present? || area.present?

    where(['blood_group LIKE ? AND area LIKE ?', "%#blood_group%", "%#area%"])
end

结束

【问题讨论】:

- 为什么你在使用 params[:blood_group] 吗? 我猜 params[:blood_group] 在你的情况下评估为 nil。 @AdnanDevops 只是猜测,但如果表单错误,该值将被填充。 错误出现在哪一行? 错误出现在我在搜索表单中使用 select_tag 的行 【参考方案1】:

您的搜索表单必须是这样的:

<%= form_tag find_path , method: :get, remote: true do %>

         <p> <%= label_tag :blood_group %><br />
          <%= select_tag (:blood_group), options_for_select(%w[ A+ B+ O+ AB+ A- B- O- AB-]) %> </p>

         <p> <%= label_tag :area %><br />
          <%= select_tag (:area), options_for_select(%w[Indore Vijay_Nagar Bhawar_Kuwa Rajendra_Nagar Geeta_Bhawan Aerodram Tejaji_Nagar Raj_Mohalla Rajwada Chandan_Nagar Gandhi_Nagar Arvindo MY Bombay_Hospital]) %> </p> 


          <%= submit_tag "Search" , class: "btn btn-primary" , name: nil %>
        <% end %>

修改你的控制器为:

def find
  @donors = Donor.search(params[:blood_group], params[:area]).all 
  respond_to do |format|
    format.js
  end
end

然后添加 find.js.erb 以显示搜索到的内容。

【讨论】:

以上是关于Ruby on Rails:高级搜索,nil:Nilclass 的未定义方法 []的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails:高级搜索,nil:Nilclass 的未定义方法 []

Ruby on Rails 高级 JSON 序列化

Ruby on Rails:搜索表单 - 多个搜索字段

在 Ruby on Rails 中搜索的最佳选择是啥? [关闭]

Ruby on Rails - 简单表单自动完成关联搜索

在 Ruby on Rails 3 应用程序中实现搜索?