[RUBY-ON-RAILS] 레일 다음 respond_to 블록 작업을 수행하는 방법?
RUBY-ON-RAILS레일 다음 respond_to 블록 작업을 수행하는 방법?
나는이 레일 가이드 시작하기를 통해 갈거야 및 6.7와 혼동되었다. 비계를 생성 한 후 나는 내 컨트롤러에서 다음 자동 생성 된 블록을 찾을 수 있습니다 :
def index
@posts = Post.all
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @posts }
end
end
나는 respond_to 블록은 실제로 작동 않는 방법을 이해하고 싶습니다. 형식은 어떤 종류의 변수인가? 형식 개체의 .html 중에서 및 .json 방법이 있습니까? ActionController :: MimeResponds :: ClassMethods에 대한 문서 :: respond_to는 질문에 대답하지 않습니다.
해결법
-
==============================
1.루비에 새로운 오전이 같은 코드에 붙어있어. 나는 전화를 끊었다있어하는 부분에 내가 여기에있는 몇 가지 답변보다 더 근본적인 조금 있었다. 이 또는 다른 사람을 도움이되지 않을 수 있습니다.
루비에 새로운 오전이 같은 코드에 붙어있어. 나는 전화를 끊었다있어하는 부분에 내가 여기에있는 몇 가지 답변보다 더 근본적인 조금 있었다. 이 또는 다른 사람을 도움이되지 않을 수 있습니다.
http://api.rubyonrails.org/v4.1/classes/ActionController/Responder.html
http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html
그것은 (JS 같은 의사 코드를 사용하여) 다음과 같이 쓸 수있다 :
// get an instance to a responder from the base class var format = get_responder() // register html to render in the default way // (by way of the views and conventions) format.register('html') // register json as well. the argument to .json is the second // argument to method_missing ('json' is the first), which contains // optional ways to configure the response. In this case, serialize as json. format.register('json', renderOptions)
이 부분은 저 지옥을 혼동. 나는 아직도 그것을 직관적 찾을 수 있습니다. 루비는이 기술을 상당히을 사용하는 것 같다. 반 전체 (응답자)에있어서 실장된다. 우리는 그들이하는 방법과 같은 개체를 전달되는 콜백을 통과 할 의무가있는, 그래서 활용 method_missing하기 위해, 우리는 클래스의 인스턴스가 필요합니다. 코딩 누군가를 들어 C-같은 20 몇 년 동안 언어, 이것은 매우 뒤로하고 직관적 나에게있다. 그것은 나쁜하지 않는 것이! 그러나 배경 필요의 종류 많은 사람들이 그것의 일이 주위에 그들의 머리를 얻기 위해, 그리고 나는 영업 이익은 후 무슨 수 있습니다 생각합니다.
추신. RoR에 4.2 respond_to는 응답자 보석으로 추출하고 있습니다.
-
==============================
2.이는 레일 헬퍼 메소드를 활용 루비 코드 블록이다. 아직 블록에 익숙하지 않은 경우, 당신은 그들에게 루비에서 많이 볼 수 있습니다.
이는 레일 헬퍼 메소드를 활용 루비 코드 블록이다. 아직 블록에 익숙하지 않은 경우, 당신은 그들에게 루비에서 많이 볼 수 있습니다.
respond_to 컨트롤러 클래스에 부착 (또는 오히려, 수퍼 클래스)되는 레일 헬퍼 메소드이다. 그것은 (브라우저로가는)보기로 전송됩니다 응답을 참조한다.
블록에서 '포맷'파라미터를 전달하여 - - 당신의 예에서 블록 데이터를 포맷하는 브라우저가 HTML 또는 JSON 데이터에 대한 요청을 할 때마다 뷰 컨트롤러로부터 전송된다.
// 로컬 호스트 : 3000 / 게시물 당신은 HTML 형식으로 모든 소식을 볼 것입니다 당신이 당신의 로컬 컴퓨터에 있고 당신이 당신의 포스트가 설정 비계가있는 경우, 당신은 HTTP에 갈 수 있습니다. HTTP :이 입력 할 경우에, // 로컬 호스트 : 3000 / posts.json을, 당신은 서버에서 전송 된 JSON 객체에서 모든 게시물을 볼 수 있습니다.
이것은 필요가 앞뒤로 서버에서 JSON 전달하는 것을 자바 스크립트 무거운 응용 프로그램을 만들기위한 매우 편리합니다. 당신이 원하는 경우에, 당신은 쉽게 백엔드 당신의 레일에 JSON API를 만들 수 있습니다, 단 하나 개의보기를 통과 - 당신의 포스트 컨트롤러의 인덱스 뷰처럼. 그런 다음 데이터를 조작하고 자신의 인터페이스를 만들 JQuery와 또는 백본 (또는 둘 다)와 같은 자바 스크립트 라이브러리를 사용할 수 있습니다. 이러한 비동기 UI를라고 그들은 (Gmail의 하나입니다) 정말 인기 becomming된다. 그들은 매우 빠르다 및 최종 사용자에게 웹에 더 데스크탑과 같은 경험을 제공합니다. 물론,이 데이터 포맷의 하나의 장점이다.
는이 될 것이라고 쓰기의 3 방법을 레일 :
class PostsController < ApplicationController # GET /posts # GET /posts.xml respond_to :html, :xml, :json def index @posts = Post.all respond_with(@posts) end # # All your other REST methods # end
HTML, : XML : respond_to으로 바꾸어 클래스의 상단에 JSON을, 당신은 당신이 컨트롤러가 귀하의 의견에 보내려고하는 모든 형식을 선언 할 수 있습니다.
그런 다음 컨트롤러 방법, 당신이해야 할 모든 respond_with입니다 (@whatever_object_you_have)
그냥 조금 더 자동 생성 어떻게 레일 이상의 코드를 단순화합니다.
당신은 이것의 내부 - 동작에 대해 알고 싶다면 ...
내가 이해에서, 레일은 실제 형식이 될 것입니다 어떤 결정하기 위해 개체를 내부적으로 점검. '포맷'변수 값이 반성에 기초한다. 레일은 정보의 조금으로 전체를 많이 할 수 있습니다. 포스트 갈 것입니다 : 당신은 간단한의 @post 또는 얼마나 놀랄 것입니다.
나는 _user.html.erb 부분 파일이 있다면 예를 들어, 다음과 같이 보인다고 :
_user.html.erb
<li> <%= link_to user.name, user %> </li>
그런 다음 내 인덱스보기에서 혼자 레일은 '사용자의 모든 객체를 반복을가'사용자 '가 일부 발견 할 필요가 있음을 알고 할 것입니다 :
index.html.erb
<ul class="users"> <%= render @users %> </ul>
레일은 '사용자의 모든 객체를 반복을이 부분'사용자 '를 발견 할 필요가 있음을 알고 할 것입니다 :
당신은 도움이 블로그 게시물을 찾을 수 있습니다 : http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
https://github.com/rails/rails : 당신은 또한 소스를 정독 할 수 있습니다
-
==============================
3.당신은 모든 단일 컨트롤러에서 사용할 수 있도록 모두가 ActionController에서 상속 때문에 내가 아는 바로는, respond_to는의 ActionController에 부착하는 방법입니다. 여기에 레일 respond_to 방법은 다음과 같다 :
당신은 모든 단일 컨트롤러에서 사용할 수 있도록 모두가 ActionController에서 상속 때문에 내가 아는 바로는, respond_to는의 ActionController에 부착하는 방법입니다. 여기에 레일 respond_to 방법은 다음과 같다 :
def respond_to(&block) responder = Responder.new(self) block.call(responder) responder.respond end
내가 여기에 보여처럼 당신은 그것을 블록을 통과하고 있습니다 :
respond_to <<**BEGINNING OF THE BLOCK**>> do |format| format.html format.xml { render :xml => @whatever } end <<**END OF THE BLOCK**>>
| 형식 | 일부는 우리가 그것을 사용할 수있는 respond_to 방법 내부 있도록 블록이 기대하는 인수입니다. 어떻게?
당신은 우리가 접두사 &의 respond_to 방법으로 블록을 통과 통지하고, 글쎄, 우리는 PROC로 그 블록을 치료하기 위해 그렇게. 인수가 ".XML"을 가지고 있기 때문에 메소드가 호출 될로서, ".html 중에서"우리가 사용할 수 있습니다.
우리가 기본적으로 respond_to 클래스에서 할 것은 응답자 클래스의 인스턴스에 대한 호출 방법 ".html 중에서, .XML, .json"입니다.
-
==============================
4.형식이 무엇인지 이해하기 위해서는, 먼저 respond_to의 소스에서 볼 수 있지만, 빨리 당신은 당신이 볼 필요가 정말 무엇을 retrieve_response_from_mimes의 코드는 것을 확인할 수 있습니다.
형식이 무엇인지 이해하기 위해서는, 먼저 respond_to의 소스에서 볼 수 있지만, 빨리 당신은 당신이 볼 필요가 정말 무엇을 retrieve_response_from_mimes의 코드는 것을 확인할 수 있습니다.
여기에서, 당신은 (코드에) respond_to에 전달 된 블록이, 실제로 전화를 (블록 내에서 형식으로 참조) 수집기의 인스턴스로 전달되는 것을 볼 수 있습니다. 콜렉터는 기본적 대해 무엇을 알고 마임 유형의 레일에 따라 (I 레일은 시작시 믿는다) 메소드를 생성합니다.
그래서, 예, .html 중에서 및 .json 클래스 (형식 일명) 수집기에 (실행시) 정의 방법이 있습니다.
-
==============================
5.응답자 등록 (마른 오징어의 답변을 참조) 뒤에 메타 프로그래밍도이 같은 멋진 물건을 수행 할 수 있습니다 :
응답자 등록 (마른 오징어의 답변을 참조) 뒤에 메타 프로그래밍도이 같은 멋진 물건을 수행 할 수 있습니다 :
def index @posts = Post.all respond_to do |format| format.html # index.html.erb format.json { render :json => @posts } format.csv { render :csv => @posts } format.js end end
csv로 라인은 /posts.csv 방문 할 때 각 게시물에 호출 할 to_csv의 원인이됩니다. 이것은 당신의 레일 사이트에서 CSV (또는 다른 형식) 등의 수출 데이터에 쉽게이를 수 있습니다.
JS 라인은 자바 스크립트 파일 /posts.js (또는 /posts.js.coffee)가 실행 / 렌더링되게한다. 나는 아약스 jQuery를 UI 팝업을 사용하여 사이트를 활성화 만들 수있는 경량의 방법이 될 것으로 나타났습니다.
-
==============================
6.자바 POV에서, 형식은 익명 인터페이스의 implemtation입니다. 이 인터페이스는 각 MIME 타입의 이름을 딴 하나의 방법이있다. 하면 (그것을 블록을 통과하는) 그 방법 중 하나를 호출하면, 사용자가 해당 콘텐츠 형식을 원한다고 레일 Feel로는, 그것은 당신의 블록을 호출합니다 다음 경우.
자바 POV에서, 형식은 익명 인터페이스의 implemtation입니다. 이 인터페이스는 각 MIME 타입의 이름을 딴 하나의 방법이있다. 하면 (그것을 블록을 통과하는) 그 방법 중 하나를 호출하면, 사용자가 해당 콘텐츠 형식을 원한다고 레일 Feel로는, 그것은 당신의 블록을 호출합니다 다음 경우.
트위스트는 물론, 익명 접착제 객체가 실제로 인터페이스를 구현하지 않는다는 것입니다 -이 방법은 동적으로 호출하고 MIME 타입의 그 이름이 그것에 대해 알고 있는지 작동 잡는다.
개인적으로, 나는 그것이 이상한 보이는 생각 : 당신이 통과하는 블록이 실행됩니다. 그것은 형식 라벨 및 블록의 해시를 전달하기 위해 나에게 더 의미가있다. 그러나 - 그것의 RoR에서 수행 방법의 것을 보인다.
-
==============================
7.라이언 Bigg는 여기를 설명하는 훌륭한 일을 수행함으로써이 조금 구식입니다 :
라이언 Bigg는 여기를 설명하는 훌륭한 일을 수행함으로써이 조금 구식입니다 :
http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to
사실, 당신이 찾고 있던 것보다 조금 더 상세하게 될 수 있습니다. 그것이 나오는 것에 따라, 많은 MIME 형식이로드되는 방법을 이해 할 필요를 포함, 무대 뒤에서 벌어지고있다.
-
==============================
8."형식"응답 유형입니다. 예를 들어, JSON 또는 HTML이 될 수 있습니다. 그것은 당신의 방문자가받을 출력 형식입니다.
"형식"응답 유형입니다. 예를 들어, JSON 또는 HTML이 될 수 있습니다. 그것은 당신의 방문자가받을 출력 형식입니다.
-
==============================
9.MIME - 당신이 알아야 할 한 가지 더있다.
MIME - 당신이 알아야 할 한 가지 더있다.
당신이 MIME 타입을 사용할 필요가 있으며 기본적으로 지원되지 않는 경우, 당신은 설정 / 초기화 / mime_types.rb에 자신의 핸들러를 등록 할 수 있습니다 :
마임 :: Type.register "텍스트 / 인하": 인하
from https://stackoverflow.com/questions/9492362/rails-how-does-the-respond-to-block-work by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 메모리 누출 감지 루비 / 루비 (0) | 2020.02.12 |
---|---|
[RUBY-ON-RAILS] 레일 4 : before_filter 대 before_action (0) | 2020.02.12 |
[RUBY-ON-RAILS] 레일에서 참조 열 이동을 추가 4 (0) | 2020.02.12 |
[RUBY-ON-RAILS] 쿼리 열 수를 선택할 수 없습니다 (0) | 2020.02.12 |
[RUBY-ON-RAILS] 액티브의 진수 대 플로트 (0) | 2020.02.12 |