使用Ajax动态地将项添加到Ruby On Rails中的选择列表(再次)

时间:2010-08-19 21:24:12

标签: ruby-on-rails ajax

行。所以我非常接近。 。 。太沮丧了。请帮忙。以下是两个下拉列表,它们是产品/新页面的一部分

<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 =&gt;各种不同的方式,但它总是只发布localhost:3000 / products / get_subcategories。如果我直接转到URL localhost:3000 / products / get_subcategories / 1,部分渲染就好了。同样,如果我用observehost:3000 / products / get_subcategories / 1替换observe_field中的:url,它可以正常工作(当然不是动态的)。

这是发布的标题:

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=')
  })
})
//]]>

2 个答案:

答案 0 :(得分:0)

如果您阅读生成的JavaScript,您会看到select simple中的参数不存在。为什么会这样?应该怎么知道?您可以使用options to observe_field中的:with键启用它。

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

答案 1 :(得分:0)

行。我想出了我的问题,这很愚蠢。我没有包括:with的原因是因为根据文档默认情况下已经发送了观察值。好吧,在查看日志后,我确实添加了:with with in(:with =&gt;“value” )它仍然无法正常工作。但问题出在products_controller的get_subcategories方法中。一旦我将params更改为Subcategory.find_all_by_category_id(params [:value])。sort_by {| k | k ['name']},Doh!瞧,它有效。

对于所有回复此帖和其他人的人,我感谢你提出一个新的Ruby用户,他认为这是一个神秘的Rails语法问题,而不是一个简单的名称更改。