2014-06-29 23 views
0

我在窗體中有多個複選框,其中我將每個字段的結果存儲在我使用attr_accessor:attribute在模型中指定的相應臨時字段中。我想用逗號分隔符將這些字段的內容加入到一個字段中,並將其存儲到數據庫中。如何使用分隔符在rails 4應用程序中將字符串字段連接到一個字段?

我的完整形式是這樣的:

<%= form_for @company do |f| %> 
    <% if @company.errors.any? %> 
    <div id="error_explanation"> 
    <h2><%= pluralize(@company.errors.count, "error") %> prohibited 
     this company from being saved:</h2> 
    <ul> 
    <% @company.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
    <% end %> 
    </ul> 
    </div> 
    <% end %> 


    <p> 

    <div class="row"> 
     <div class='col-sm-6'> 
      <div class="form-group"> 
       <p> 
    <%= f.label :name %><br> 
    <%= f.text_field :name,class:'form-control' %> 
    </p> 
<p> 
    <%= f.label :grade %><br> 

    <%= f.select(:grade, options_for_select([['Dream', 'dream'], ['A++', 'a++'], ['A+', 'a+'],['A', 'a']])) %> 
    </p> 

    <p> 
    <%= f.label :beCutoff %><br> 
    <%= f.text_field :beCutoff,class:'form-control' %> 


    </p> 
    <%= f.label :branchesAllowed %><br> 
<%= f.check_box :coe, {}, "COE", "" %><%= label_tag :COE %><br> 

    <%= f.check_box :ece, {}, "ECE", ""%><%= label_tag :ECE %><br> 
    <%= f.check_box :ice, {}, "ICE", ""%><%= label_tag :ICE %><br> 
    <%= f.check_box :it, {}, "IT", ""%><%= label_tag :IT %><br> 
    <%= f.check_box :mpae, {}, "MPAE", ""%><%= label_tag :MPAE %><br> 
    <%= f.check_box :bt, {}, "BT", ""%><%= label_tag :BT %><br> 
    <%= f.check_box :is, {}, "IS", ""%><%= label_tag :IS %><br> 
    <%= f.check_box :sp, {}, "SP", ""%><%= label_tag :SP %><br> 
    <%= f.check_box :pc, {}, "PC", ""%><%= label_tag :PC %><br> 
    <p> 
    <%= f.label :backsAllowed %><br> 
    <%= f.text_field :backsAllowed,class:'form-control' %> 
    </p> 
<p> 
    <%= f.label :details %><br> 
    <%= f.text_field :details,class:'form-control' %> 
    </p> 
    <p> 
    <%= f.label :package %><br> 
    <%= f.text_field :package,class:'form-control' %> 
    </p> 
    <p> 
    <%= f.label :xiiCutoff %><br> 
    <%= f.text_field :xiiCutoff,class:'form-control' %> 
    </p> 
    <p> 
    <%= f.label :xCutoff %><br> 
    <%= f.text_field :xCutoff,class:'form-control' %> 
    </p> 
    <%= f.label :deadline %><br> 

       <div class='input-group date' id='datetimepicker1'> 

        <%= f.text_field :deadline ,class:'form-control',:readonly=>true%> 
        <span class="input-group-addon" ><span class="glyphicon glyphicon-calendar"></span> 
        </span> 
       </div> 
      </div> 
     </div> 
     <script type="text/javascript"> 
      $(function() { 
       $('#datetimepicker1').datetimepicker({format: 'YYYY-MM-DD HH:mm:ss '}); 
      }); 

     </script> 

    </div> 

    <p> 
    <%= f.submit %> 
    </p> 



<% end %> 

我指定的字段:安科:ECE,:冰等在我的模型作爲attr_accessor:

class Company < ActiveRecord::Base 

    attr_accessor :coe,:ece,:ice,:it,:mpae,:bt,:is,:pc,:sp 


    validate :deadline_on_or_before_now 

    def deadline_on_or_before_now 
    errors.add(:deadline, "can't be in the past") if 
     !deadline.blank? and deadline < (Time.zone.now+19800).to_datetime 
    end 

    validates :name, presence: true, 
        length: { minimum: 2 }; 
    validates :grade,:beCutoff,:details,:package, presence: true; 
    validates_inclusion_of :beCutoff,:xiiCutoff,:xCutoff, :in=> 0..100,:message=>"Out of Range"; 

end 

我的控制器看起來像這樣:

class CompaniesController < ApplicationController 
    def new 
     @company = Company.new 
    end 

    def edit 

     @company = Company.find(params[:id]) 
    end 

    def update 
     @company = Company.find(params[:id]) 

     if @company.update(company_params) 
      redirect_to @company 
     else 
      render 'edit' 
     end 
    end 

    def create 

     @company = Company.new(company_params) 

     if @company.save 
      redirect_to @company 
     else 
      render 'new' 
     end 
    end 

    def index 
     @companies = Company.all 
    end 
    def destroy 
     @company = Company.find(params[:id]) 
     @company.destroy 

     redirect_to companies_path 
    end 

    def show 
     @company = Company.find(params[:id]) 

    end 


    private 
     def company_params 

      params.require(:company).permit(:name, :beCutoff,:grade,:xiiCutoff,:xCutoff,:backsAllowed,:details,:package,:deadline,:branchesAllowed,:coe,:ece,:ice,:it,:mpae,:bt,:is,:sp,:pc) if params[:company] 
     end 
end 

我想加入:安科:ECE,:冰等領域,並將其存儲到:branchesAllowed(串場)的F使用commma分隔符,並且可以在需要分開使用時分割此字段。 我使用rails 4.1的postgresql。

+0

我不想再次混淆代碼,所以當然一​​個讓我做一次更改方法的方法會有所幫助。但我想知道這兩種方法。 – Pranav

回答

0

最快和最骯髒的方式是簡單地拼接領域中的方法你模型並呼籲在before_save回調方法:當你打電話save

class Company < ActiveRecord::Base 
    # . . . 

    before_save :combine_branches # or choose other callback type respectively 
    def combine_branches 
    self.branchesAllowed = "" 
    self.branchesAllowed += "COE" if coe 
    self.branchesAllowed += "ECE" if eve 
    self.branchesAllowed += "ICE" if ice 
    # … and so on … 
    end 
end 

現在您的控制器中的update回調觸發器並在寫入數據庫之前設置branchesAllowed字段。

然而,這並不是真的乾燥,也不容易擴展。如果你想添加另一個分支,你至少需要編輯3個不同的地方。

一個(ER)的解決方案可能是類似以下內容:

class Company < ActiveRecord::Base 
    # keep a constant of possible branches tied to the model 
    POSSIBLE_BRANCHES = [:coe, :ece, :ice, :it, :mpae, :bt, :is, :pc, :sp] 

    # add the branches as virtual attributes (only assign methods) 
    attr_writer *POSSIBLE_BRANCHES 

    # add virtual attributes reader methods 
    # --> define every branch as method, that looks if the value is currenly 
    # stored in the branchesAllowed string and return true or false 
    POSSIBLE_BRANCHES.each do |pb| 
    define_method(pb) do 
     self.banchesAllowed.split(',').include?(pb.to_s.upcase) 
    end 
    end 

    # add the callback to combine the branches 
    before_save :combine_branches 
    def combine_branches 
    self.banchesAllowed = POSSIBLE_BRANCHES.select { |pb| !!self.send(pb) }.map(&:upcase).join(',') 
    end 
end 

那麼你也可以在視圖中使用它們:

<%= f.label :branchesAllowed %><br> 
<% Company::POSSIBLE_BRANCHES.each do |pb| %> 
    <%= f.check_box pb, {}, pb.to_s.upcase, "" %><%= label_tag pb.to_s.upcase %><br> 
<% end %> 

所以,如果你想添加稍後的另一個分支只需將另一個符號添加到數組常量中即可完成。希望有所幫助。在複選框

UPDATE

由於boolean值默認使用'1''0'(字符串),我不能完全肯定,如果虛擬屬性讀者的方法應該返回一個布爾值的那個來代替。

+0

我用這兩種方式,他們的工作。只要適用一些條件,一切都是完美的。謝謝 – Pranav

+0

如果您告訴我在編輯帖子時檢索選項或取消選中選項的任何方式,這將非常有幫助。 – Pranav

0

我會稍微有點不同。假設這些都是您想要設置的Company的所有屬性,則可以使用單個整數字段來存儲此數據,方法是創建一個屬性類型的數組,並將該數組中的每個屬性的索引用作二進制值,您可以使用它來確定是否設置屬性。

關注此Railscast一個完整的解釋,因爲瑞安做它比我想象的要好得多:http://railscasts.com/episodes/189-embedded-association

+0

謝謝@Jon我感謝您的幫助。我之前在應用程序中嘗試過數組,但是我發現在某些地方數組並不是好東西。另外我想快速修復這個應用程序。 – Pranav

+0

在Rails中使用數組沒有任何問題。此外,你應該更喜歡快速閃光的正確修復。 – Jon

1

如果我想做的事是這樣,我會去存儲在一個字符串字段的哈希。

before_save :create_string 

def create_string 
    fields = {} 
    fields[:coe]=coe 
    fields[:ece]=ece 
    # etcetera 
    branchesAllowed = fields.to_s # hash to string and then store the string 
end 

,然後檢索值(讓我們在控制器或視圖說):

values = eval(@company.branchesAllowed) # reversely, evaluate string to hash 
@coe = values[:coe] 
@ece = values[:ece] 
# etcetera 
+0

我試過@vapire的方式來解決和爲我工作,你的解決方案看起來很像。謝謝你的幫助。 – Pranav

+0

@Pranav,沒問題:) –

相關問題