Rails: разница между attr_accessor и attr_accessible - PullRequest
1 голос
/ 05 августа 2011

В чем разница? Кроме того, почему это не работает:

Переменные, такие как 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, но этот атрибут равен нулю, поэтому я получаю ошибку. Есть идеи?

Ответы [ 2 ]

8 голосов
/ 05 августа 2011

attr_accessor создает получатель method.attribute и установщик 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/"

Вы уверены, что правильно создали экземпляр своего класса?

1 голос
/ 05 августа 2011

attr_accessor просто создает метод получения-установки для атрибута.

attr_accessible указывает белый список атрибутов модели, которые могут быть установлены посредством массового назначения, таких как new (attribute), update_attributes (attribute)) или атрибуты = (атрибуты).Это было взято из ссылки здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...