ajax와 rails로 요소를 열고 닫고 싶습니다.

13529 단어 아약스Rails


이번에는 is_shop 라는 열에서 조건 분기를 합니다.
그래서 enum에서 동시에 저장할 수 있는 항목(값)을 정의.

expert_collection.rb
class ExpertCollection < ActiveRecord::Base
    enum is_shop: { limited: 0 , altogether: 1 }
end

#この書き方はis_shopがinteger型



_form.html.erb.rb

<script type="text/javascript">
$(function(){

=====①======
 <% if @expert_collection.is_shop == 'limited' %>
  $('#is_shop_area_1').show();
 <% else %>
  $('#is_shop_area_1').hide();
 <% end %>

============
=====②======
  $("#expert_collection_is_shop_limited").click(function(){
    $('#is_shop_area_1').show();
  });
  $("#expert_collection_is_shop_altogether").click(function(){
    $('#is_shop_area_1').hide();
  });

============

// 全て選択・解除

  CLASS_NAME_INDEX    = 0;
  VALUE_INDEX         = 1;

    var set_all_is_shop_value = function(is_shop_name, value){
    $('.' + is_shop_name).each(function() {
      $(this).attr("checked", value);
    });
  };

  $(".set_all_button").click(function(){
    class_name_and_value = $(this).attr("id").split("-");
    if ( class_name_and_value[VALUE_INDEX] == 'false' ) {
      class_name_and_value[VALUE_INDEX] = false;
    }
    set_all_is_shop_value(class_name_and_value[CLASS_NAME_INDEX], class_name_and_value[VALUE_INDEX]);
  });

});
</script>


<%= form_for [:ar_admin, @expert_collection], :html => {:multipart => true} do |f| %>
<tr>
<th scope="row">実施店舗</th>
<td>
<%= f.radio_button :is_shop, :limited %><label for="_is_shop_1">店舗限定 </label>
<%= f.radio_button :is_shop, :altogether %><label for="_is_shop_2">全て </label>
</td>
</tr>
<table class="form_area " id="is_shop_area_1">
<tr>
<th scope="row">対象店舗</th>
<td>
<% for shop in current_site.real_shops %>
<%= check_box_tag "shop_ids[]", shop.id, @expert_collection.real_shops.ids.include?(shop.id), :id => "shop_id_#{shop.id}" , :class => 'shop'%>
<%= label_tag "shop_id_#{shop.id}", shop.name %>
<% end %>
<% if current_site.real_shops.present? %>
<br />
<input type="button" value="全て選択" id="shop-true" class="set_all_button" /> <input type="button" value="全て解除" id="shop-false" class="set_all_button" />
<% end %>
</td>
</tr>
</table>

<p class="change"><a href="<%= url_for :action => :index %>"><img src="/images/ar_admin/form/btn_prev.jpg" alt="前のページへ戻る" class="nav" /></a> <input type="image" src="/images/ar_admin/form/btn_regist.jpg" alt="登録する" class="nav" /></p>
<% end %>

js 속에 고리고리 rails의 문법을 쓰는 것 같다limited'은 enum의 기법. enum이 아니면 필요없는 부분이라고 생각됩니다.
①is_shop의 값이 limited(왼쪽의 버튼)이면 아래의 테이블 열림 limited가 아니면 숨긴다(이것은 편집 화면의 때의 분기.처음에 값이 들어가 있는지 보기 위해)
②도 의미는 ①과 동일

expert_collections_controller.rb

  def edit
    @expert_collection = ExpertCollection.site(current_site.id).find(params[:id])
  end

  def update
    @expert_collection = ExpertCollection.site(current_site.id).find(params[:id])
    @expert_collection.site_id = current_site.id
    @expert_collection.real_shops = RealShop.find(params[:shop_ids]) if params[:shop_ids].present?
    @expert_collection.attributes = params[:expert_collection]   ☆
    if @expert_collection.save   ☆
      redirect_to ar_admin_expert_collections_path, notice: "エキスパートコレクションを更新しました。"
    else
      render :edit
    end
  end


업데이트시 ☆ 부분이 if @expert_collection.update_attributes(params[:expert_collection])이면 안되고 새롭게 건너온 파라미터를 추가하고 다시 save 해주면 잘 업데이트되지 않는다

좋은 웹페이지 즐겨찾기