2016-04-07 11 views
1

テーブル:配列をチェックインして値と比較するにはどうすればよいですか?

|perfils| 
    |id| |name| 
    1  Administrator 
    2  Admin for products 

|accesses| 
    |id| |parent_id| |name| 
    1  0  Module Clients #parent 
    2  1   Show Client ###child from Module Clients 
    3  1   New Client ###child = Module Clients 
    4  1   Edit Client ###child = Module Clients 
    5  0  Module Products #parent 
    6  5   Show Product ###child = Module Products 
    7  5   New Product ###child = Module Products 

|perfil_accesses| 
    |id| |access_id| |perfil_id| 
    1  1   1 
    2  2   1 
    3  3   1 

コントローラーperfil_controller.rb:

def edit 
    @perfi = Perfil.find(params[:id]) 

    @perfil.perfil_accesses.each do |perfil_access| 
    @selected_perfil << perfil_access.id 
    end 

    @accesses = Grant.where(parent_id: 0).map do |access| 
    { parent: access, children: Grant.where(parent_id: access.id) } 
    end 
end 

モデル

#Perfil.rb 
    has_many :perfil_accesses 

#PerfilAccess.rb 
    belongs_to :grant 
    belongs_to :perfil 

表示new.html.erb

<%= form_for(@perfil) do |f| %> 
<%= f.label :name %><br> 
<%= f.text_field :name %> 

<% @grants.each do |access| %> 
<div> 
    <input type="checkbox" class="parentCheckBox" /> <%= access[:parent].name %> 
    <a onclick="document.getElementById('div_<%= access[:parent].id %>').style.display='';return false;"><img src="https://cdn0.iconfinder.com/data/icons/ie_Bright/512/plus_add_green.png" height="20" width="20"></a> 
    <a onclick="document.getElementById('div_<%= access[:parent].id %>').style.display='none';return false;"><img src="https://cdn0.iconfinder.com/data/icons/ie_Bright/512/minus_remove_green.png" height="20" width="20"></a> 
    <br/> 

    <div id="div_<%= access.id %>" style="display:none;"> 
    <ul> 
    <% access[:children].each do |grant|%> 
     <li><input id="access_<%= grant.id %>" name="access_<%= grant.id %>" type="checkbox" class="childCheckBox" /><%= grant.name %></li> 
    <% end %> 
    </ul> 
    </div> 
</div>  
<% end %> 

<%= f.submit %> 
<% end %> 

ここに問題があります: 作成されたかどうかを確認します。

<input id="access_<%= access[:parent].id %>" name="access_<%= access[:parent].id %>" 
    <% if @selected_perfil.include? == access[:parent].id %> 
     checked="checked" 
    <% end %> 

私が試した:

<input id="access_<%= access[:parent].id %>" name="access_<%= access[:parent].id %>" 
    <% if @selected_perfil.id == access[:parent].id %> 
     checked="checked" 
    <% end %> 

を私が作成したperfil_accessesからのすべてのアクセスをチェックしたいです。

+0

あなたはあなたのコードで働いていないものについて、もう少し詳細を与えることができますか? –

+0

選択したチェックでは、作成されたすべてのチェックが行われていません –

答えて

1

を空の配列に初期化することはないため、コードが完全ではないようです。とにかく

:あなたは存在しない配列のidを比較してみてください、あなたのコード内で今(あなたはおそらくすでに発見されたとして)include?

a = [1,2,3,4] 
a.include?(1) # => true 
a.include?(7) # => false 

を配列の要素の存在を確認することができます(あなたが古いバージョンのrubyを実行しない限り)。実際に何をしたいのは、配列内に存在するかどうかを確認することです。

@selected_perfil.include?(access[:parent].id) 

このトリックを行う必要があります。

私が正しい理解場合、これは@perfilに関連するperfil_accessオブジェクトのすべてのidsが含まれている必要があります。ただ、access[:parent].id

いくつかのヒント整数であることを確認してください?

あなたはこれを簡素化することができます。

@perfil.perfil_access.map(&:id) 

そして、あなたは(perfilアクセスオブジェクトをロードする必要がない場合)、純粋なSQLでそれを実行したい場合は:

@perfil.perfil_access.pluck(:id) 
+0

あなたの回答はうまくいきましたが、より良い方法が見つかりました。 –

0

私はビューの関係と呼ばれる配列と特定の値との比較を比較する方法を発見しました。

コントローラー:

def edit 
    @perfil = Perfil.find(params[:id]) 
    @access_selected = PerfilAccess.where('perfil_id= ?',@perfil.id) 

    @accesses = Grant.where(parent_id: 0).map do |access| 
    { parent: access, children: Grant.where(parent_id: access.id) } 
    end 
end 

ビュー

<% @perfil_selected.each do |ps| %> 
    <% if ps.access_id == access[:parent].id %> 
     checked="checked" 
    <% end %> 
<% end %>