无法访问定义的attr_accessor变量

6
我正在使用Thinking Sphinx来运行搜索,并且可以正确获取ActiveRecord模型。问题是,我想要在每个模型上创建适当的链接路径和文本,然后通过AJAX以JSON的形式将信息发送到浏览器。我正在使用以下代码来构建这些链接属性:
在控制器中:

class FindController < ApplicationController
  def tag_results
    @results = ThinkingSphinx.search(params[:terms])
    @results.each do |result|
      result.build_ajax_response
    end
    respond_to do |format|
      format.html
      format.json { render :json => @results }
    end
  end
end
在模型中:

class TaggedItem < ActiveRecord::Base
  attr_accessible :name
  attr_accessor :search_link, :search_text

  def build_ajax_response
    self.search_link = Rails.application.routes.url_helpers.tagged_item_path(self.id)
    self.search_text = self.name
  end
end 

生成的JSON对象没有列出search_*属性,更别说为它们设置值了。我已经尝试使用@search_link以及build_ajax_response方法中的search_link。 我做错了吗?还有其他可能会干扰的因素吗?

你尝试过在控制台上使用 build_ajax_response 吗?有什么异常抛出吗?有什么设置吗? - Draiken
当我运行<code>build_ajax_response</code>时,它不会引发任何错误,但是按照典型的Ruby风格,它确实返回最后评估的表达式。(在这种情况下,是self.name) - Tricnic
1个回答

10

Rails默认的to_json无法识别你添加的那些额外的非Active Record属性。最简单的方法可能是将它们指定为要包含的额外方法:

format.json { render :json => @results.to_json(:methods => [:search_link, :search_text]) }

这确实是我想要的!谢谢,Frederick。 - Tricnic
这对我也起作用了。只是为了澄清,在JSON中它返回这些指定方法的结果,除了常规属性。 - Justin Schier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接