Rails 3:通过 AJAX 为每个协会单独检索内容

Rails 3: Retrieve content separately for each Association through AJAX

提问人:rgoraya 提问时间:1/28/2012 最后编辑:rgoraya 更新时间:1/28/2012 访问量:147

问:

我的系统设置了以下关联:

class Book < ActiveRecord::Base
has_many : suggestions
has_many : comments
has_many : references

在我的 Book 模型的“显示”视图上,我想为用户提供一个选项,以选择(从下拉框中)他们想要查看的视图。因此,例如,如果用户从此下拉框中选择建议,则部分将重新加载建议。其他 3 个选项也是如此。 为了实现这一点,我在我的模型 book.rb 中编写了以下方法:

def self.select_content_type(content_type)
case content_type

when "suggestions"
  # get the suggestions
  @book_suggestions = Book.suggestions.paginate(:per_page => 6, :page => params[:page])
  # return this
  return @book_suggestions

when "comments"
  # get the comments
  @book_comments = Book.comments.paginate(:per_page => 6, :page => params[:page])
  # return this
  return @book_comments

when "references"
  # get the references
  @book_references = Book.references.paginate(:per_page => 6, :page => params[:page])
  # return this
  return @book_references

结束

结束

我正在尝试在我的 book_controller.rb 的“显示”操作中访问此方法,如下所示:

@book_content = Book.select_content_type(params[:content_type])

“显示”视图中,我使用以下表单向此方法发出 get 请求:

   - form_tag  book_path(@book), :id=>"select_rel_form", :remote => true, :method => 'get' do               
      = text_field_tag :content_type, params[:content_type], :id=>"select_rel_type"
      = submit_tag "submit", :name => nil, :class=>"select_rel_submit"  

在名为 *_content* 的部分中,我正在访问返回的值,如下所示:

- if !@book_content.nil?
  - @issue_relations.each do |relation|
    ...

我收到以下错误:

NoMethodError (undefined method `suggestions' for #<Class:0x1177f4b8>):
app/models/book.rb:93:in `select_content_type'
app/controllers/books_controller.rb:21:in `show'

请帮助我了解如何解决此问题。如果有正确和更好的方法来实现这一目标,请指导我。谢谢。

jQuery ajax ruby-on-rails-3 model-view-controller unobtrusive-javascript

评论

0赞 redronin 1/28/2012
你的 book.rb 方法self.select_content_type永远不会起作用。您在模型中引用了 params[:p age],但您没有该变量。params 在控制器中,我看不出您将其传递到模型中的位置。
0赞 rgoraya 1/29/2012
@redronin,我正在使用 will_paginate 对内容进行分页(一次显示 6 个)。params[:p age] 是一个will_paginate参数。

答:

0赞 Unknown_Guy 1/28/2012 #1

你的表单标签有select_content_type,正如它所说的那样,它是未定义的,但你应该有类似 book_path(@book) 的东西

评论

0赞 rgoraya 1/28/2012
谢谢你的回答。现在,窗体似乎可以根据需要访问 Model 方法。但是,我收到另一个错误(更新了问题)。不知何故,.suggestions 关联未被正确识别。
0赞 Unknown_Guy 1/29/2012
它不被识别,因为你有你应该有的东西,然后Book.comments@book = Book.find(params[:id])@book_comments = @book.comments.paginate(:per_page => 6, :page => params[:page])
0赞 redronin 1/28/2012 #2

不是答案,但您的self.select_content_type方法可能更 DRYer:

def self.select_content_type(content_type)
  return unless ['suggestions', 'comments', 'references'].include?(content_type)
  Book.send(content_type.to_sym).paginate(:per_page => 6, :page => params[:page])
end

此外,您使用 params[:p age],但从不传入 params。您应该将此方法保留在控制器中,不确定为什么需要将其保留在模型中。

评论

0赞 rgoraya 1/29/2012
@redorin,您是否建议我将其设置为控制器方法并在我的 routes.rb 文件中指定路由?你能指导我为什么在这种情况下会更好吗?