【问题标题】:Rails: difference between attr_accessor and attr_accessibleRails:attr_accessor 和 attr_accessible 之间的区别
【发布时间】:2011-08-05 14:59:11
【问题描述】:

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

未设置 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 但该属性为空,所以我得到一个错误。有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-03-09
        • 2015-08-27
        • 1970-01-01
        • 2011-02-08
        • 2021-12-25
        • 2020-05-10
        • 2014-09-20
        • 2010-10-28
        相关资源
        最近更新 更多