2017-02-21 47 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,[])' –