Rails:attr_accessor和attr_accessible之间的区别

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

未设置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,所以我得到一个错误。 有任何想法吗?

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

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

编辑:

至于你的第二个问题,我不知道。 我尝试了这个虚拟代码并且它有效:

 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/" 

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

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

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