Ruby on Rails:为什么我的搜索不起作用?

时间:2017-02-21 17:15:00

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 search

在我的RoR应用程序中,我允许用户选择他们想要发送电子邮件的联系人。用户通过表单上的复选框选择这些联系人。我正在尝试添加搜索功能,以便用户可以按名字搜索,只显示与该搜索匹配的联系人的复选框。

要做到这一点,我试图在视图上使用此代码:

<div class="form-group">
    <label>From Email Address</label></br>
    <% @useraccounts.each do |useraccount| %>
        <%= f.radio_button :account_id, useraccount.account_id, :checked => false %>
        <%= f.label :account_id, useraccount.account.email, :value => "true"  %><br>
    <% end %>
</div>
<div class="form-group">
    <%= form_tag '/emails/contact_search', :method => 'get' do %>
      <p>
        <%= text_field_tag :search_string, params[:search_string], :placeholder => "Search by firstname" %>
        <%= submit_tag "Search", :name => nil %>
      </p>
    <% end %>
    <label>Contacts</label></br>
    <%= f.collection_check_boxes :contact_ids, @contacts, :id, :fullname %>
</div>

@contacts实例变量保存从控制器中搜索返回的联系人。

当用户点击搜索按钮时,应调用以下控制器操作。

def contact_search
    @email.recipients.build
    @useraccounts = Useraccount.where(user_id: session[:user_id])
    @contacts = Contact.contacts_search(params[:search_string])
    if @contacts.empty?
        flash.now[:alert] = "There are no contacts with that name."
        @contacts = Contact.all
    end
    render :action => "new"
end

此控制器操作使用contact_search方法,该方法位于Contact.rb模型中:

def self.contact_search(search_string)
    self.where("firstname LIKE ?", search_string)
end

我在路线中也有contact_search

post 'emails/contact_search', :to => 'emails#contact_search'
get 'emails/contact_search', :to => 'emails#contact_search'

但出于某种原因,当用户点击搜索时,他们会在表单上获得NoMethodError in Emails#create undefined method 'each' for nil:NilClass。错误如图所示。

enter image description here

我无法理解为什么这不起作用,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

通过erb,我猜你form_tag区内有一个form_for ...你不能这样做

当您点击提交时,操作将转到第一个表单操作...可能是创建

最好将form_tag移到上一个form区块之外......

答案 1 :(得分:0)

似乎您的模态名称( Useraccount )不正确,必须 UserAccount

另请注意

当我们使用ActiveRecord模式的where查询时,我们永远不会得到NIL对象,除非我们有错误的模态名称。