Rails:attr_accessor和attr_accessible之间的区别

bde*_*vic 1 ruby attributes model ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

在我看来,我引用@ cvit.some_attribute.html_safe,但该属性为null,因此我收到错误.有任何想法吗?

dee*_*see 8

attr_accessor为指定的属性创建getter method.attribute和setter 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/"
Run Code Online (Sandbox Code Playgroud)

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