提问人:rgoraya 提问时间:1/28/2012 最后编辑:rgoraya 更新时间:1/28/2012 访问量:147
Rails 3:通过 AJAX 为每个协会单独检索内容
Rails 3: Retrieve content separately for each Association through AJAX
问:
我的系统设置了以下关联:
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'
请帮助我了解如何解决此问题。如果有正确和更好的方法来实现这一目标,请指导我。谢谢。
答:
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 文件中指定路由?你能指导我为什么在这种情况下会更好吗?
评论