복붙노트

[RUBY-ON-RAILS] 레일 : 커피 스크립트 또는 자바 스크립트 자산 파일에 액세스 컨트롤러 인스턴스 변수

RUBY-ON-RAILS

레일 : 커피 스크립트 또는 자바 스크립트 자산 파일에 액세스 컨트롤러 인스턴스 변수

레일 3.1 그러한 <% = @foo %가> @foo가 제어부에 설정되는 경우로 구문을 사용하여 자산 js.erb 또는 coffee.erb 파일에 액세스 제어기 인스턴스 변수 불가능하다. 그래서 다음 질문은 커피 스크립트 또는 자바 스크립트 자산 컨트롤러 변수를 전달하기위한 최선의 방법이 무엇인지입니다.

이 질문에 친절 포럼에서 여러 뒤얽힌 형태로 요청을받은의,하지만 다시 물어 내 포인트는 모든 권장 모인 장소를 가지고 있으며, 공급 코드는 간단하고 읽을 수 있습니다. 또한 내가 특별히 자산을 참조하지 응답 파일을 볼 수있어 있습니다.

해결법

  1. ==============================

    1.몇 가지 방법은 과거에 이런 짓을했는지 I

    몇 가지 방법은 과거에 이런 짓을했는지 I

    숨겨진 필드에 데이터를 입력, 접속 JS의 데이터 / 커피

    # single value
    <%= hidden_field_tag "foo_name", @foo.name, { :id => "foo-name" } %>
    $('#foo-name').val();
    
    # when the 'value' has multiple attributes
    <%= hidden_field_tag "foo", @foo.id, { :id => "foo", "data-first-name" => @foo.first_name, "data-last-name" => @foo.last_name } %>
    $foo = $('#foo')
    console.log $foo.val()
    console.log $foo.data("firstName")
    console.log $foo.data("lastName")
    

    또 다른 옵션 : JS에서 ERB에서 JS 데이터 구조로 하중 데이터 액세스를 / 커피

    <% content_for(:head) do %>
        <script>
        window.App = window.App || {};
        window.App.Data = window.App.Data || {};
        window.App.Data.fooList = [
            <% @list.each do |foo| %>
                <%= foo.to_json %>,
            <% end %>
        ];
        </script>
    <% end %>
    
    
    # coffee
    for foo in window.App.Data.fooList
        console.log "#{foo.id}, #{foo.first_name} #{foo.last_name}"
    

    나는 그것에 대해 뭔가 그냥 잘못 느낌이 같은 ERB에 루비에서 자바 스크립트 데이터 구축의 큰 팬이 아니다 - 그것은 효과가 있지만 될 수 있습니다

    또 다른 옵션은 : 아약스 전화를 걸 및 주문형 서버에서 데이터를 얻을

    나는 또한 다른 아이디어와 접근 방식에 관심

  2. ==============================

    2.이 특정 주제에 대한 정말 좋은 레일 출연진과 아주 최근 (. 2012년 2월)이 있습니다 : 자바 스크립트로 데이터 전달 # 324

    이 특정 주제에 대한 정말 좋은 레일 출연진과 아주 최근 (. 2012년 2월)이 있습니다 : 자바 스크립트로 데이터 전달 # 324

    스크립트 태그, 데이터 속성, 그리고 곤 보석 : 그것은 3 가지 방법을 보여줍니다. 나는 집이 가능한 모든 기술을 적용 생각합니다. 난 단지 당신이 둘의 데이터, 동적 데이터 또는 조합의 큰 볼륨을 가지고 때 AJAX 호출을 사용하는 것은 가장 잘 사용하는 것을 언급한다.

  3. ==============================

    3.오히려 사용하는 것보다 숨겨진 필드 나는 JQuery와 픽업 할 수있는 컨테이너 DIV에 데이터 속성을 추가하기로 결정했습니다.

    오히려 사용하는 것보다 숨겨진 필드 나는 JQuery와 픽업 할 수있는 컨테이너 DIV에 데이터 속성을 추가하기로 결정했습니다.

    <div class="searchResults" data-query="<%= @q %>"></div>
    

    다음 JQuery와는 액세스 할 수

    url: "/search/get_results?search[q]=" + $(".searchResults").data("query") + "&page=" + p
    

    나는이 자바 스크립트에 데이터를 전달하는 가장 깨끗한 방법입니다 생각합니다. 컨트롤러에서 레일 자산 파이프 라인과 커피 스크립트 파일에 변수를 전달하는 방법을 발견 한 후. 이것은 내가 지금 사용하는 방법입니다. 누군가가 최선을 다 할 것이다 레일 컨트롤러 방법을 설정합니까까지 기다릴 수 없습니다.

  4. ==============================

    4.컨트롤러에서 :

    컨트롤러에서 :

    @foo_attr = { "data-foo-1" => 1, "data-foo-2" => 2 }
    

    뷰 (HAML)에서 :

    #foo{@foo_attr}
    

    커피 스크립트 자산에서 :

    $("#foo").data("foo-1")
    $("#foo").data("foo-2")
    
  5. ==============================

    5.자바 스크립트 데이터가 곤 보석은 여전히 ​​곤 설정 한 후, 심지어 2015 년, 레일에 갈 수있는 좋은 방법입니다 사용하여 손에서 얻는 경우 상황에서는 단순히 데이터를 할당하여 자바 스크립트 파일에 데이터를 전달 할 수 있습니다 레일의 곤 개체.

    자바 스크립트 데이터가 곤 보석은 여전히 ​​곤 설정 한 후, 심지어 2015 년, 레일에 갈 수있는 좋은 방법입니다 사용하여 손에서 얻는 경우 상황에서는 단순히 데이터를 할당하여 자바 스크립트 파일에 데이터를 전달 할 수 있습니다 레일의 곤 개체.

    (Gemfile)
    gem 'gon'
    
    (controller) 
    def index 
      gon.products = Product.all 
    
    (layouts) 
    <%= include_gon %> 
    
    (public/javascripts/your_js_can_be_here.js) 
    alert(gon.products[0]['id'); 
    
    (html source automatically produced) 
    <script> 
      window.gon = {}; 
      gon.products = [{"created_at":"2015", "updated_at":"2015, "id":1, "etc":"etc"}];
    

    당신은 곤 또는 라이언 노여움의 스크린 캐스트에서 두 개의 다른 레일 - 자바 스크립트 채널에 대한 더 자세한 구현 세부 정보를 읽을 수 있습니다. http://railscasts.com/episodes/324-passing-data-to-javascript

  6. ==============================

    6.그런 다음 response.js.erb에에 액세스 편집 컨트롤러에 PARAMS 배열에 변수를 추가 할 수 있습니다. [여기서 value 여기서 PARAMS 갖는 예이다 :

    그런 다음 response.js.erb에에 액세스 편집 컨트롤러에 PARAMS 배열에 변수를 추가 할 수 있습니다. [여기서 value 여기서 PARAMS 갖는 예이다 :

    def vote
      value = params[:type] == "up" ? 1 : -1
      params[:value] = value
      @public_comment = PublicComment.find(params[:id])
    
      have_voted = @public_comment.evaluators_for(:pub_votes_up) << @public_comment.evaluators_for(:pub_votes_down)
    
      unless have_voted.include?(@current_user) # vote
        @public_comment.add_or_update_evaluation(:"pub_votes_#{params[:type]}", value, @current_user)
      else                                      # unvote
        @public_comment.delete_evaluation(:"pub_votes_#{params[:type]}", @current_user)
        params[:value] = 0
      end
    
      respond_to do |format|
        format.js # vote.js.erb
      end
    end
    

    그리고 여기 예 동반 response.js.erb입니다

    button = $('<%= ".pub#{params[:type]}_#{params[:id]}" %>')
    label = button.find('strong')
    <% comment = PublicComment.find(params[:id]) %>
    label.html('<%= comment.reputation_for(:"pub_votes_#{params[:type]}").to_i %>')
    
    <% if params[:value] == 1 %>
      button.addClass('btn-success')
    <% elsif params[:value] == -1 %>
      button.addClass('btn-danger')
    <% else %>
      if button.hasClass('btn-success') { button.removeClass('btn-success') }
      if button.hasClass('btn-danger') { button.removeClass('btn-danger') }
    <% end %>
    
  7. from https://stackoverflow.com/questions/8513912/rails-access-controller-instance-variable-in-coffeescript-or-javascript-asset-f by cc-by-sa and MIT license