2010-08-19 1 views
0

OK. 그래서 나는 너무 가깝다. . . 그래서 좌절했다. 도와주세요. 여기에 제품의 일부 목록을 아래로 두 개의 드롭/새 페이지가Ajax (다시)를 사용하여 Ruby On Rails의 선택 목록에 항목을 동적으로 추가합니다.

<p> 
    <%= f.label :category_id %>: 
    <%= f.select("category", Category.find(:all).collect {|c|[c.name, c.id]})%> 
</p> 

<%= observe_field :product_category, :url => {:controller => 'products', :action => 'get_subcategories'}, :update => "subcategory_div" %> 

Subcategory: <div id="subcategory_div"></div> 

이 같은 제품 컨트롤러의 코드를 가지고 :

def get_subcategories 
    @subcategories = Subcategory.find_all_by_category_id(params[:id]).sort_by{ |k| k['name'] } 
    render :partial => "subcategories", :locals => {:subcategories => @subcategories}, :layout => false 
end 

이 부분이다 :

<select id="product_subcategory" name="product[subcategory]"> 
    <% for subcategory in subcategories %> 
    <option value="<%= subcategory.id %>"><%= subcategory.name %></option> 
    <% end %> 
</select> 

첫 번째 드롭 다운을 클릭하면 관측이 시작되지만 매개 변수는 전송되지 않습니다. 추가 시도 : with => 다양한 다른 방법이 있지만 항상 localhost : 3000/products/get_subcategories 만 게시합니다. URL localhost : 3000/products/get_subcategories/1로 직접 이동하면 부분 렌더링이 잘됩니다. 마찬가지로, observe_field의 : url을 localhost : 3000/products/get_subcategories/1로 바꾸면 잘 작동합니다 (물론 동적은 아닙니다).

 
http://localhost:3000/products/get_subcategories 

POST /products/get_subcategories HTTP/1.1 
Host: localhost:3000 
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 
Accept: text/javascript, text/html, application/xml, text/xml, */* 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
X-Requested-With: XMLHttpRequest 
X-Prototype-Version: 1.6.0.3 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Referer: 
Content-Length: 69 
Cookie: _Customer_Portal_session=BAh7BzoQX2NzcmZfdG9rZW4iMWFmeGFqaXo0T0t3MkJqSG9ONjRDaWpROVdzWDc1K0Jtd1hYZldtcGh5ems9Og9zZXNzaW9uX2lkIiU2M2E3OWNjNDU4NTdhOTQ2ZDgyMGQyOWUyYWM1MGRiOA%3D%3D--c8fc61c71a851b22183015150365b2eb1df0d356 
Pragma: no-cache 
Cache-Control: no-cache 
1&authenticity_token=afxajiz4OKw2BjHoN64CijQ9WsX75%2BBmwXXfWmphyzk%3D 
HTTP/1.1 200 OK 
Connection: close 
Date: Thu, 19 Aug 2010 21:20:23 GMT 
Etag: "0799f242edbcaef2390601b55aaa04c2" 
Content-Type: text/html; charset=utf-8 
X-Runtime: 55 
Content-Length: 74 
Cache-Control: private, max-age=0, must-revalidate 
---------------------------------------------------------- 

이는 소스의 모습입니다 :

는 게시 된 헤더 당신이 결과 자바 스크립트를 읽는다면

//<![CDATA[ 
new Form.Element.EventObserver('product_category', function(element, value) { 
    new Ajax.Updater('subcategory_div', '/products/get_subcategories',{ 
    asynchronous:true, 
    evalScripts:true, 
    parameters:value + '&authenticity_token=' + encodeURIComponent('afxajiz4OKw2BjHoN64CijQ9WsX75+BmwXXfWmphyzk=') 
    }) 
}) 
//]]> 

답변

0

당신이 볼을 그 매개 변수 select simple은 존재하지 않습니다. 왜 그럴까요? 어떻게 알 수 있을까요? options to observe_field에있는 :with 키를 사용하면 효과를 볼 수 있습니다.

<%= 
    observe_field(
    :product_category, 
    :url => { 
     :controller => 'products', 
     :action => 'get_subcategories' 
    }, 
    :with => 'id', 
    :update => "subcategory_div" 
) 
%> 
0

확인. 나는 내 문제를 알아 냈고 바보 같았다. 내가 with :를 포함하지 않은 이유는 기본적으로 문서에 따르면 관측 된 값이 전송 되었기 때문입니다. 음, 로그를보고 난 후에 : with :와 함께 (: with => "value")를 추가했습니다. 여전히 작동하지 않았습니다. 그러나 문제는 products_controller의 get_subcategories 메소드에 있습니다. params를 Subcategory.find_all_by_category_id (params [: value])로 변경하자마자 sort_by {| k | k [ 'name']}, Doh! 그리고 짜잔, 그것은 효과가 있었다.

이 게시물 및 다른 사람들에게 답변 한 모든 분들께 간단한 이름 변경이 아닌 매우 복잡한 레일스 구문 문제라고 생각한 새로운 Ruby 사용자를 만났던 것에 감사드립니다.