2016-11-18 32 views
0

我創建了一個「select_tag」字段,當用戶單擊保存該字段的所有值以通過參數傳遞給控制器​​時,我需要它。問題是當我點擊保存時,只有在此字段中輸入的第一個值被傳遞給控制器​​。在參數中傳遞select_tag的值

爲了更好地理解,「select_tag」字段通過另一個字段「f.text_field:members」字段填充。當我點擊一個「添加」按鈕時,「f.text_field:members」字段的值被傳遞給「select_tag」字段,因此我希望能夠從「select_tag」字段中檢查所有這些值以驗證和保存,我該怎麼做?正如我已經說過的,只有輸入的第一個值被傳遞。

現在看看參數,我意識到返回爲「參數」的值只是在下拉列表中選擇的值,其他值不予考慮。如何傳遞下拉菜單中的所有值?

代碼:

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

     <ul> 
     <% @focus_group.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <script type="text/javascript"> 
    $(function() { 
    $('#focus_group_moderator, #focus_group_members').autocomplete({ 
     source: '/focus_groups/autocomplete.json' 
    }); 
    }); 
    function add(){ 
    var value = $('#focus_group_members').val(); 
    var select = document.getElementById("membersAdded"); 
    var option = document.createElement("option"); 
    option.text = value; 
    option.value = value; 
    select.add(option); 

    $('#focus_group_members').val(""); 
    } 

    function removeFromSelect(){ 
    var select = document.getElementById("membersAdded"); 
    select.remove(select.selectedIndex); 
    } 
    </script> 
    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :topic %><br> 
    <%= f.text_field :topic %> 
    </div> 
    <div class="field"> 
    <%= f.label :moderator %><br> 
    <%= f.text_field :moderator %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %><br> 
    <%= f.text_area :description %> 
    </div> 
    <div class="field"> 
    <%= f.label :members %><br> 
    <%= f.text_field :members %> 
    <input onclick="add()" type="button" value="Add" /><br> 
    <%= select_tag(:membersAdded, options_for_select([])) %> 
    <input onclick="removeFromSelect()" type="button" value="Remove" /><br> 
    <br> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

控制器

class FocusGroupsController < ApplicationController 
    before_action :set_focus_group, only: [:show, :edit, :update, :destroy] 
    include FocusGroupsHelper 

    def index 
    if(params[:term]) 
     @profile = Profile.all.select("name", "id") 

     @lista = Array.new 

     @profile.each do |x| 
     @lista.push(x.name) 
     end 

     respond_to do |format| 
     format.html 
     format.json { render json: @lista.to_json} 
     end 
    else 
     @focus_groups = FocusGroup.all 
    end 
    end 

    def show 
    end 

    def new 
    @focus_group = FocusGroup.new 
    @membersAdded 

    respond_to do |format| 
     format.html 
     format.json { render json: Profile.all.to_json} 
    end 
    end 

    def edit 
    end 

    def create 
    @moderator= find_profiles_id(focus_group_params[:moderator]) 
    @moderator.each do |f| 
     @moderator_id = f.id 
    end 

    @params = focus_group_params 
    @params[:moderator] = @moderator_id 

    @focus_group = FocusGroup.new(@params) 

    if @focus_group.save 
     redirect_to @focus_group, notice: 'Focus group was successfully created.' 
    else 
     render :new 
    end 
    end 

    def update 
    if @focus_group.update(focus_group_params) 
     redirect_to @focus_group, notice: 'Focus group was successfully updated.' 
    else 
     render :edit 
    end 
    end 

    def destroy 
    @focus_group.destroy 
    redirect_to focus_groups_url, notice: 'Focus group was successfully destroyed.' 
    end 

    def autocomplete 
    if(params[:term]) 
     @profile = Profile.all.where("user_id <> 0 and is_template = 'f' and name LIKE ?", "#{params[:term]}%").select("name", "id") 

     @lista = Array.new 

     @profile.each do |x| 
     @lista.push(x.name) 
     end 

     respond_to do |format| 
     format.html 
     format.json { render json: @lista.to_json} 
     end 
    end 
    end 

    def find_profiles_id(name) 
    return Profile.all.where("name LIKE ?", "#{name}%").select("id") 
    end 

    def find_profiles_name(id) 
    @profile = Profile.all.where("id = ?", "#{id}").select("name") 

    @profile.each do |e| 
     @name = e.name 
    end 
    return @name 
    end 

    private 

    def set_focus_group 
     @focus_group = FocusGroup.find(params[:id]) 
    end 

    def focus_group_params 
     params.require(:focus_group).permit(:name, :topic, :moderator, :description, :members, :membersAdded) 
    end 
end 
+0

發佈您的控制器代碼,包括您的params方法。是允許參數列表中的select-tag字段? – toddmetheny

+0

編輯@toddmetheny – Luis

+0

現在看看這些參數,我意識到作爲「params」返回的值只是在下拉列表中選擇的值,其他值不會被考慮。如何傳遞下拉菜單中的所有值? – Luis

回答

0

幾種方法可以解決這個 - 但選擇框本身沒有任何意義,在這種情況下使用。不提供實用程序。這是一種方法。你有單獨的成員模型嗎?這似乎是你基本上試圖做一個嵌套的形式。如果您沒有members型號,請創建一個。分別創建一個焦點組,並將其成員的表單放在FocusGroup的展示頁面上。焦點組有許多成員,並且成員屬於焦點組(具有焦點組ID)。這將允許你說@ focus_group.members並讓所有成員回來。

如果由於某種原因(我認爲這不是最佳),您必須將它們添加到相同的表單中,那麼您將需要通過嵌套表單與表單構建器進行嵌套,從而允許您一次添加多個表單。你也可以創建一個服務對象,但這更復雜。

另一個我喜歡的選項是將所有成員推送到一個數組,然後在提交時將其作爲參數傳遞。不要將成員添加到選擇框,而只需將它們推送到數組。然後你將最終的數組值設置爲members_added(或者你指定的參數)。您需要在控制器中解壓該數組以創建每個成員。我更喜歡這個。第一個選項是最乾淨的。我認爲這是三人中第三好的方法。

+0

我明白你的意思前兩個選項我沒有立即使用,因爲我正在開發這個應用程序的同時學習rails,因爲我沒有太多時間。我知道它不會奏效,但不要擔心,因爲它對這個軟件沒有商業目的。即使在這種情況下,第三種選擇是最好的選擇,但我該怎麼做?當我把這個數組放在一個字段中,並通過params將它分配給我的控制器時,你可以創建一個示例代碼嗎? 非常感謝您的關注。 – Luis

+0

哈哈 - 這是最糟糕的選擇!第一個是最容易做和最好的!你會省下一些痛苦。但是如果你想要第三個選項......你可以爲'members_added'創建一個'hidden_​​field',然後每次你點擊add時,獲取該hidden_​​field的值並更新數組。然後,當你提交時,所有這些值將在你隱藏的領域。 – toddmetheny