2017-02-21 39 views
1

在我的RoR应用程序中,我有一个表单,用户可以通过名字搜索他们的联系人,并选择他们想要发送电子邮件的联系人。我的问题是,在搜索说“Tom”并选择“Tom”复选框后,如果他们重置搜索以显示所有复选框“Tom”不再被选中。Ruby on Rails:在搜索后保留复选框

有人可以告诉我这可以排序吗?

视图中的代码是:

<div class="panel-body"> 
    <%= form_tag '/emails/contact_search', :method => 'get' do %> 
     <p> 
     <%= text_field_tag :search_string, params[:search_string], :placeholder => "Search by firstname" %> 
     <%= submit_tag "Search" %> 
     </p> 
    <% end %> 
    <%= form_for(@email) do |f| %> 
     <fieldset> 
      <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"> 
       <label>Contacts</label></br> 
       <%= f.collection_check_boxes :contact_ids, @contacts, :id, :fullname, checked: @selected_contact_ids %> 
      </div> 
      <div class="form-group"> 
       <label>Groups</label></br> 
       <%= f.collection_check_boxes :group_ids, Group.where(user_id: session[:user_id]), :id, :name ,{ prompt: "name" } %> 
      </div> 
      <div class="form-group"> 
       <label>Attachment</label> 
       <%= f.file_field :attachment, :size => 42 %><br> 
      </div> 
      <div class="actions"> 
       <%= f.submit "Continue", {:class => 'btn btn-primary '} %> 
       <%= render "/error_messages", :message_header => "Cannot save: ", :target => @email %> 
      </div></br> 

     </fieldset> 
    <% end %> 
</div> 

搜索的控制器代码:

def contact_search 
    @email = Email.new(session[:email_params]) 
    @email.current_step == session[:email_step] 
    @useraccounts = Useraccount.where(user_id: session[:user_id]) 
    @contacts = Contact.contact_search(params[:search_string]) 
    if @contacts.empty? 
     flash[:notice] = "There are no emails with that subject" 
     @contacts = Contact.all 
    end 
    render :action => "new" 
end 
private 
def email_params 
    params.require(:email).permit(:subject, :message, :account_id, { contact_ids: [] }, { group_ids: [] }, :attachment) 
end 

和模型:

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

我不知道如何在用户搜索其他内容或重新设置搜索结果后选中某个复选框,是否有人可以提供一些信息如何实现这一目标?

+0

请不要标记任何问题,这纯粹是一个Rails问题,而不是Ruby。 – Iceman

+0

我正在使用Ruby on Rails 4,问题是关于复选框,我觉得这些标签是相关的。 –

+0

不,您标记了Ruby和Rails3,这是无关紧要的。对于Rails4,这不是一个问题,只是在讨论这个方法。 – Iceman

回答

0

这似乎是Rails的那些晦涩难懂的特性之一。什么也要做是传递数组如果ID来被检查到checked参数

= f.collection_check_boxes :contact_ids, @contacts, :id, :fullname, checked: @selected_contact_ids 

,然后检查盒用的id 1,2和3项将被检查。你需要以某种方式明显地从控制器传递这个数组。例如。

@selected_contact_ids = email_params.fetch(:contact_ids, []) 
+0

谢谢:)不幸的是,选择复选框并再次搜索后,这仍然不起作用,复选框不再被选中 –

+0

什么是从表单发布的参数?也许你只需要调整'params.fetch('部分来得到正确的值,我自己测试了这个,所以代码工作,你只需要调整它到你的案例。 – Iceman

+0

我已经添加了'email_params'包括在控制器中,我还在'contact_search'方法的'render:action =>“new”'上面添加了'@selected_contact_ids = params.fetch(:contact_ids,[])' –