在Ruby on Rails 7中构建搜索功能

wqnecbli  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(101)

我是Ruby on Rails的新手,我正在我的Ruby on Rails应用程序中构建一个搜索功能。详情如下:

  • 我的应用程序中有一个员工模型、视图和控制器。
  • 我打算使用搜索功能来搜索员工的姓名。
  • 详情如下:
    员工视图
</div></div>
  <div class="col-sm-9">

<div class="form-group">
 <%= form_with url: employees_path, class: "form-control rounded-0", method: :get do |form| %> 
    <label for="exampleInputEmail1">Search Employee</label>
    
      <%= text_field_tag(:employeesearchfield)  %>
       
    <%= form.submit "Search" %>
    <%end%>
  </div>

字符串

路线

Rails.application.routes.draw do
  
  resources :operations
  get 'operations/:preason', to: 'operations#index'
  get 'pages/Administratorhome'
  get 'pages/userhome'
  devise_for :users
  resources :employees do 

    collection do 
    delete 'delete_multiple'
    end 
    collection do
    post 'import' 
    end
    collection do 
    get 'export'
    end
  end

  put "employees/:id", to: 'employees#show'
  

  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
  root to: "pages#Administratorhome"
  # Below route is required for logout functionality.
  devise_scope :user do
    get 'users/sign_out' => "devise/sessions#destroy"
end
  # Defines the root path route ("/")
  # root "articles#index"
end

员工控制人

def index
   @employees = Employee.search_employee(params[:employeesearchfield])
  end

员工模型

def self.search_employee(employeename)
    
    searchvar = employeename 
    
      if searchvar.nil?
        employeelist = Employee.all
      else
        employeelist = Employee.find_by(name: "searchvar")
      end  
      return employeelist
  end


尝试使用“搜索”表单搜索员工时,出现NoMethod错误
Error:
我无法理解为什么@employee示例变量为null。
我尝试了byebug gem并试图找到数据流。
我发现搜索表单中的参数“params[:employeesearchfield]”没有流入这个方法。

qcbq4gxm

qcbq4gxm1#

当你在@employees.each行得到一个undefined method 'each' for nil时,这意味着@employees变量返回nil
发生这种情况是因为你模型中的这条线

employeelist = Employee.find_by(name: "searchvar")

字符串
因为find_by只返回第一个找到的记录,而nil在没有找到时返回。此外,您的查询是硬编码的,总是搜索字符串"searchvar",而不是变量searchvar
要解决问题,请将方法更改为:

def self.search_employee(employee_name)
  if employee_name.nil?
    Employee.all
  else
    Employee.where(name: employee_name)
  end  
end


请注意,您可以通过在模型中定义这样的范围来进一步简化代码:

scope :filter_by_name, ->(name) { where(name: name) if name }


在你的控制器中使用scope:

def index
  @employees = Employee.filter_by_name(params[:employeesearchfield])
end

相关问题