Нужно объяснение некоторого синтаксиса Ruby - PullRequest
1 голос
/ 06 июня 2011

Я новичок в ruby ​​на рельсах, кто-нибудь может объяснить, что означает символ ':', что означают 'validates' и 'create_table'? Так много смущения ...

class Post < ActiveRecord::Base
   validates :name, :presence => true
   validates :title, :presence => true, :length => {:minimum => 5}
end

class CreatePosts < ActiveRecord::Migration
   def change
     create_table :posts do |t|
       t.string :name
       t.string :title
       t.text :content
       t.timestamps
     end
    end
 end

Ответы [ 8 ]

6 голосов
/ 06 июня 2011
  1. Символ двоеточия (:) является началом синтаксического литерала для "символа" в Ruby:

    :abc.class # => Symbol
    "abc".to_sym # => :abc

    Символы похожи на строки, но они «интернированы», то есть интерпретатор Ruby имеет только одну копию в памяти, несмотря на множество возможных ссылок (тогда как в памяти может быть много эквивалентных строк одновременно).

  2. Токен 'validates' в вашем примере выше - это метод класса (чего-то в иерархии классов «класса Post»), который вызывается с символьным аргументом (:name) и хэш-аргумент с одной парой ключ / значение :presence => true.

  3. Токен 'create_table' - это метод, который вызывается с одним аргументом (символ ":posts") и получает блок , который принимает один аргумент " т "(do |t| ... end).

1 голос
/ 06 июня 2011

Документация по Ruby и Документация по Ruby on Rails :

"что означает символ :?" Класс: Символ

Объекты символов представляют имена и некоторые строки внутри интерпретатора Ruby. Они генерируются с использованием синтаксиса литералов: name и: "string" и с помощью различных методов to_sym. Один и тот же объект Symbol будет создан для данного имени или строки на время выполнения программы, независимо от контекста или значения этого имени. Таким образом, если Fred является константой в одном контексте, методом в другом и классом в третьем, Symbol: Fred будет одним и тем же объектом во всех трех контекстах.

"что было бы validates?" ActiveModel :: Validations :: * 1018 методы класса *

Этот метод является ярлыком для всех валидаторов по умолчанию и любых пользовательских классов валидаторов, заканчивающихся на «Валидатор». Обратите внимание, что валидаторы по умолчанию в Rails могут быть переопределены внутри определенных классов, создав вместо них собственные классы валидаторов, такие как PresenceValidator.

"что будет create_table?" ActiveRecord :: ConnectionAdapters :: SchemaStatements

Создает новую таблицу

(ссылка показывает примеры, показывающие операторы SQL, сгенерированные этим методом.)

1 голос
/ 06 июня 2011

: foo - это «символ», который по сути является неизменяемой строкой.Его основным преимуществом является тот факт, что он не выделяет новый объект каждый раз, когда вы его используете.Если бы вы использовали строку «имя» каждый раз, когда вам нужно было использовать ее, вы каждый раз создавали бы новый объект String.Однако если вместо этого вы используете: name, вы каждый раз используете один и тот же объект Symbol (одинаковый с точки зрения равенства указателей и идентичности объекта).

validates и create_table оба являются методами.В ruby ​​метод не нуждается в скобках при вызове, поэтому validates: foo - это то же самое, что validates (: foo).Методы приходят через наследование и модульные миксины.validates - это метод класса, помещаемый в объекты ActiveRecord во время наследования, а create_table - это метод экземпляра

1 голос
/ 06 июня 2011

:foo - это символ , то есть постоянная строка, которая гарантированно будет уникальной. Они часто используются в Ruby для ссылки на поля или методы.

validates используется в ActiveRecord для установки ограничения на значения поля.

validates :name, :presence => true означает, что поле name должно быть всегда установлено (не нулевое, неопределенное или пустое) для всех экземпляров Post (и соответствующей таблицы в БД). validates :title, :presence => true, :length => {:minimum => 5} означает, что поле title должно быть всегда установлено, а его длина должна быть больше 5.

1 голос
/ 06 июня 2011

В Ruby : означает, что это символ. Символ - это что-то вроде легкой строки, которая специально используется как идентификатор . Например, в хэше вы используете символы в качестве ключей, которые указывают на их соответствующие значения.

my_hash = {:key_1 => "A", :key_2 => "B"}

В приведенных выше примерах вы используете символы для указания свойств вашей модели Post и столбцов таблицы ваших сообщений.

Вот несколько ссылок для дальнейшего прочтения символов Ruby:

0 голосов
/ 06 июня 2011

Помимо символов, здесь следует отметить, что в Ruby нам не нужно явно указывать {}, чтобы указать, что аргумент является хэшем, если он является последним аргументом. Я имею в виду, позвонив

validates :name, :presence => true

вы звоните

validates :name, {:presence => true}

или

validates(:name, {:presence => true})

тогда становится ясно, что вы вызываете метод validates с 2 аргументами, символом и хешем. Если мы проигнорируем символ и подставим на место строки, например:

validates("name", {"presence" => true})

это очень похоже на вызов метода на любом другом языке. Так что следите за этим, так как он используется почти во всех вспомогательных тегах, используемых Rails.

Для других методов также вы можете увидеть это:

validates(:title, {:presence => true, :length => {:minimum => 5}})

В случае create_table это вызов метода с 2 аргументами, символом и блоком.

0 голосов
/ 06 июня 2011

, как все говорят, : - это начало символа. Символ - это просто имя строки или переменной для меня. В вашем примере :name - это переменная / символ, отражающая одно из имен полей в таблице Post. Rails автоматически создает эти символы при создании класса Model.

В Ruby вы можете вызывать метод / функцию и указывать их параметры с / без скобок. Итак,

проверяет: имя,: присутствие => правда

можно записать как

проверяет (: имя,: присутствие => истина)

Итак, вы фактически передаете :name и true в качестве параметров для validates метода

надеюсь, это поможет вам лучше понять методы, вызываемые в Ruby.

То же, что и validates, create_table также является методом.

0 голосов
/ 06 июня 2011

@ Гримм

Как вы должны знать, все объекты на RoR.Есть случаи, когда вам нужно отличать String от других, поскольку методы обработки памяти String отличаются от других структур данных.Двоеточие: это форма рассмотрения такого типа.Они просто символы, такие как тот, который делает запись хеша в памяти!
Привыкни к этому, будет интересно !!:)

...