Rails:attr_accessor和attr_accessible之间的区别

时间:2011-08-05 14:59:11

标签: ruby-on-rails ruby attributes model accessor

有什么区别?另外,为什么这不起作用:

未设置base_path等变量。

class Cvit < ActiveRecord::Base
  attr_accessible :species,:program,:textup,:e_value,:filter,:min_identity,:cluster_dist,:fileup_file_name
  attr_accessor :base_path, :fa_file, :text_file, :dbase, :source, :bl_file, :bl_sorted, :gff_file, :cvt_file, :db, :overlay_coords_gray

  def initilize(*args)
     super(*args)
  end

  def cvitSetup()
    self.base_path = "blast_cvit/"
    self.fa_file = "input.fa"
    .
    .
  end
end

在rails控制台中,属性设置正确,但是当我尝试这样做时:

控制器:

def show
    @cvit = Cvit.find(params[:id])
    @cvit.cvitSetup()
    @cvit.blast()
    @cvit.generateGff()
    @cvit.generateCvitImage()


    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @cvit }
    end
  end

在我的视图中我引用了@ cvit.some_attribute.html_safe,但该属性为null,因此出现错误。有什么想法吗?

2 个答案:

答案 0 :(得分:8)

attr_accessor为指定的属性创建了getter method.attribute和setter method.attribute=

attr_accessible来自ActiveRecord :: Base,“指定可通过质量分配设置的模型属性的白名单。”请参阅文档和示例here

编辑:

至于你的第二个问题,我不知道。我尝试了这个虚拟代码并且工作正常:

class Test
attr_accessor :base_path, :fa_file
  def cvitSetup()
    self.base_path = "blast_cvit/"
    self.fa_file = "input.fa"
  end
end
t = Test.new
t.cvitSetup
p t.base_path
#=> "blast_cvit/"

你确定你正确地实例化了你的课程吗?

答案 1 :(得分:1)

attr_accessor只是为属性创建一个getter-setter方法。

attr_accessible指定可以通过质量分配设置的模型属性的白名单,例如new(属性),update_attributes(属性)或attributes =(attributes)。这已从链接here

中摘录