我正在重新制定这个问题,因为我现在更好地理解了这个问题。
我有一个包含四个模型的应用程序:用户、产品、品种和季节。
用户
has_many :seasons
has_many :products, :through => :seasons
has_many :varieties, :through => :seasons
产品
has_many :seasons
has_many :users, :through => :seasons
has_many :varieties
种类
belongs_to :product
has_many :seasons
has_many :users, :through => :seasons
四季
belongs_to :product
belongs_to :user
belongs_to :variety
在产品/展示视图中,我列出了可用于特定产品的每个品种,以及携带该特定产品的用户。
首次加载产品/展示页面时,我会通过以下方式显示所有携带该产品的用户:
<% @product.seasons.each do |c| %>
<%= link_to c.user.name, c.user %>
<% end %>
我还通过这样做列出了产品可用的品种:
<% @product.varieties.each do |c| %>
<%= link_to_remote variety.name, :url => variety_path(variety) %>
<% end %>
这就是 Ajax 需要发生的地方。当我点击品种名称时,我想用@variety.seasons 替换@product.seasons 循环。我认为这应该只显示具有特定种类的用户。所以看起来像这样:
<% @variety.seasons.each do |c| %>
<%= link_to c.user.name, c.user %>
<% end %>
我越来越近了,但我无法让它工作。目前,当我点击一个品种时,前端什么也没有发生。在日志中,我得到这个:
Processing VarietiesController#4 (for ip at 2009-09-24 16:02:29) [POST]
Parameters: {"authenticity_token"=>"9pDgKrHNbg0aMklsQsGl5BQa34bfr0Ft8Fpbxki3XXw="}
ActionController::UnknownAction (No action responded to 4. Actions: check_vendor_role, index, and show)
日志引用 #4 并将 4 称为操作。4 是我点击的商品的品种 ID。
这是我的设置:
ProductsController#show
@product = Product.find(params[:id])
@varieties = @product.varieties @users = @product.users
Product/show view #列出拥有该产品的用户
<div id="userList">
<%= render :partial => "products/users" %>
</div>
#Lists the varieties available for this product
<% @product.varieties.each do |variety| %>
<%= link_to_remote variety.name, :url => variety_path(variety) %>
<% end %>
品种控制器#show。
def show
@variety = Variety.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @variety}
format.js
end
end
品种/show.js.rjs
@page.replace_html "userList", :partial => "products/users", :collection => @variety.users
因此,目前,页面正在渲染和显示正确的 html 和数据。但是 onclick 不起作用。当我点击一个品种时,应用程序没有正确处理请求并且用户列表没有改变。
更新
回应 Anatoliy 的评论:
我不确定到底需要添加什么路线。我尝试添加以下内容,但结果与之前相同:
map.resources :varieties, :member => { :show => :get }
您能否更具体地说明应该调用什么成员路由?