2011-01-01 7 views
4

난 레일에 product이라는 이름으로 스캐 폴딩 된 응용 프로그램을 만들었습니다. product_controller.rb 파일에는 다음이 포함되어 있습니다.ruby ​​on rails 기본 도움말

class ProductsController < ApplicationController 

    def new 
    @product = Product.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @product } 
    end 
    end 

    def create 
    @product = Product.new(params[:product]) 
    respond_to do |format| 
     if @product.save 
     flash[:notice] = 'Product was successfully created.' 
     format.html { redirect_to(@product) } 
     format.xml { render :xml => @product, :status => :created, :location => @product } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @product.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

이제 URL http://localhost:3000/products/create

새로운 제품 링크를 클릭
  1. 을 주어 졌을 때, 제어 컨트롤러 클래스에 새로운 정의로 전송 한 후 인스턴스 변수 @product가 생성됩니다. 이 변이는 어디에서 흘러 나왔습니까? 여기 @product

    <% form_for(@product) do |f| %> 
    #all form elements declaration 
    <% f.submit "Create" %> 
    <%= end %> 
    
  2. 컨트롤러 파일에서 초기화이 new.rhtml에 전달을 포함하는 new.rhtml 차례로 함수가 호출합니다. 그렇다면 form_for (@product)가 데이터를 가져 오는 위치는 어디입니까?

  3. 제출 버튼을 클릭 할 때 컨트롤러 파일에 함수를 만들기 위해 컨트롤이 어떻게 전송됩니까? 컨트롤러 파일에 조치가 지정되지 않습니다. @product 객체가 new.html 파일에서 수신되는 경우 redirect_to (@product)가 지정 않습니다 무엇을 만들 기능에

  4. , ...

나는 매우 혼란의 기초에 대한 생각 ROR. 누군가 내가 이것을 분명히하도록 도와주세요. 큰 게시물을 작성해 주신 것을 용서해주십시오. 이 단일 코드에서 많은 의문점을 가지고 있습니다.

+0

일부 태그를 추가하면이 질문이 더 유용 해지고 사람들이 더 쉽게 찾을 수 있습니다. 아마도 "스캐 폴딩 (scaffolding)", "라우팅 (routing)", "REST"등이 될 수 있습니다. "레일스에서 ​​새로운 객체를 만드는 컨트롤러와 폼은 어떻게 작동합니까?" – Andrew

답변

7

와우, 그게 많은 질문입니다. 먼저 "Beginning Rails 3"복사본을 가져 오는 것이 좋습니다. 레일즈에 대한 훌륭한 소개로이 모든 질문에 답하고 신속하게 매우 견고한 레일 프로그래머가 될 수 있도록 도와 드리겠습니다.

둘째, 여기 당신을 위해 몇 가지 기본적인 답변은 다음과 같습니다

1) 방금 products/new로 이동 products/create로 이동하지 않아야합니다. URL을 탐색 할 때마다 GET 요청을 보냅니다. "새로운"동작은 GET 요청을 기대하지만 CREATE 동작은 POST 요청을 기대합니다. POST 요청은 양식을 제출하여 생성됩니다.

따라서, 흐름은 다음과 같이이다 :

새로운 조치는 질문 (제품)에서 모델에 적합한 양식을 작성하는 데 사용됩니다. products/new에서 양식을 제출하면 products/create으로 게시되어 CREATE 동작의 코드를 트리거합니다.

NEW와 CREATE 간의 관계는 EDIT 및 UPDATE에서 미러링됩니다. 즉, products/123/edit으로 이동 한 개체를 변경하고 거기에서 UPDATE 동작을 트리거하는 양식을 제출합니다.

이 모든 것이 "RESTful"디자인에 해당합니다.이 디자인은 실제로 Rails의 핵심입니다. REST에 대한 자세한 내용은 here's a good place to start을 참조하십시오.

2) form_for은 컨트롤러에서 데이터를 가져 오지만 NEW 동작의 경우 데이터를 가져 오지 않고 빈 (새) 개체 만 가져옵니다. form_for은 개체를받는 도우미로 컨트롤러에서 올바르게 상호 작용하도록 생성 된 양식에 필요한 HTML 중 일부를 해당 개체에서 결정합니다.

products/edit에 페이지를로드 할 때도 마찬가지이지만, 차이점은 form_for을 기존 (새가 아닌) 객체로 전달하면 양식의 필드에 개체의 기존 값이 채워진다는 것입니다.

3) HTML <form> 태그에 설정된 HTTP 요청을 통해 제어 전송이 진행 중입니다. 이것은 레일의 '마술'의 일부이며 브라우저와 컨트롤러 간의 연결을 처리하므로 걱정할 필요가 없습니다.

4) 일반적으로 redirect_to(@product)을 사용하지 않지만 방금 만든 제품의 페이지로 이동합니다. 예 : products/123 여기서 123은 제품의 ID입니다.

도움이되기를 바랍니다. 그러나 시작 레일즈 책을 가져 오는 것이 좋습니다. 매우 좋으며 1 주일 후에 진행할 수 있습니다. 단단한 토대를 시작하여 시간을 절약 할 수 있습니다. 이런 식의 코드를 방황하는 것보다는 당신에게 전혀 익숙하지 않습니다.

+1

와우, 완벽했습니다. 앤드류에게 고마워. 이제는 B4 – CHID

+0

@ Andrew보다 더 명확하게 느껴집니다. 양식을 만들려면 모든 시간에 새로운 방법을 만들어야합니까 ?? – CHID

+0

아니요, * 모든 * 양식이 아닙니다. 양식을 사용하여 데이터베이스에 새 개체를 만드는 경우에만 해당됩니다. 또한 새로운 작업 외에도이 작업을 수행 할 수있는 다른 방법이 있지만 휠을 다시 만드는 것보다 컨벤션을 따르는 것이 훨씬 쉽습니다. 원하는 경우 HTML을 사용하여 언제든지 수동으로보기에서 양식을 수동으로 작성할 수 있습니다. – Andrew

2
  1. 데이터는 HTML POST 매개 변수를 사용하여 전달됩니다.

  2. form_for (@product)는 적절한 동작을 통해 적절한 HTML 양식을 생성하는 양식 도우미입니다.

    더 자세한 정보는 : http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

  3. 액션은 form_for에 지정되어 있습니다.

  4. redirect_to (@product)는 새로 생성 된 제품으로 사용자를 리디렉션합니다. @product에 포함 된 ID를 사용하여 Product 컨트롤러에 대한 경로를 조회하면됩니다. 라우팅에

    더는 여기에서 찾을 수 있습니다 : http://edgeguides.rubyonrails.org/routing.html

+0

Sean Hill에 감사드립니다. 귀하의 정보는 매우 유용했습니다. – CHID

0

는 사용자로서, 당신은 /products/create 경로로 가지 않을 것이다. 이것이 제출 버튼의 목적지입니다. products/new으로 이동하면 new.html.erb 템플릿에 사용 된 변수의 기본값입니다. 이 경우 @product이 생성됩니다.

제출 버튼을 누르면 /products/create으로 이동하여 생성 된 양식의 내용을 params으로 전달합니다. Rails는 params를 가져 와서 새로운 제품에 값을 지정합니다 (Mass Assignment라고하는 항목 사용).

레일즈는 "컨벤션 오버 규칙"과 매우 비슷합니다. 객체를 만드는 뷰인 /products/new보기에서 제출 버튼을 클릭하면 생성 여부를 알 수 있다고 가정합니다. 이것은 모두 REST에 의해 정의되며, 당신이 읽어야 할 것이있다.

마지막으로 redirect_to은 객체가 전달되고 있는지 알고있는 수퍼 스마트 기능이며 해당 제품에 대한 show보기로 이동하려고합니다.

+0

Tim 감사합니다. Pls이 이것을 명확히.컨트롤러 파일의 메소드에서 뷰 파일 (html)에 대한 제어가 모든 오브젝트에 항상 전달된다고 가정하면? 정확하게 하나의 함수에서 다른 함수로 객체를 전달할 때 빛을 던질 수 있습니까? – CHID

+0

@로 시작하는 변수는 "인스턴스 변수"입니다. 보기에서 자동으로 사용할 수있게되므로 명시 적으로 전달할 필요가 없습니다. –