Передача переменных для предварительного выбора в форме выбора (Ruby on rails) - PullRequest
0 голосов
/ 04 ноября 2010

Я рассматриваю пример из книги AROR: http://media.pragprog.com/titles/rails3/code/e1/views/app/views/test/select.rhtml

<% @user = "cat"

def @user.id
 4
 end

<% form_for :user do |form| %>
  <%= form.select(:name, %w{ Andy Bert Chas Dave Eric Fred }) %>
<% end %>

В этом примере похоже, что @ user.id жестко задан для возврата 4. Я пробовал что-то вроде:

@temp = 4

def @user.id
  @temp
end

Это не сработало ... Как вернуть неглобальную переменную для этой конкретной функции?

Ответы [ 2 ]

1 голос
/ 04 ноября 2010

Вы должны понимать, что когда вы делаете "def @ user.id", вы на самом деле определяете метод в классе singleton, связанном с объектом @user (класс singleton также известен как "eigenclass" или "shadow class")).То, что вы делаете, эквивалентно этому:

@temp = 4

class << @user
  def id
    @temp
  end
end

Как вы можете видеть выше, @temp внутри определения метода id является обычной переменной экземпляра, но она связана с классом singleton.Другими словами, @temp внутри определения id отличается от @temp снаружи.Вы можете решить эту проблему, непосредственно установив внутреннюю переменную @temp, например:

@user.instance_variable_set(:@temp, 4)

def @user.id
  @temp
end

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

0 голосов
/ 04 ноября 2010

Этот вопрос действительно не имеет ничего общего с формами или даже Ruby on Rails.Это чистый Ruby.

def @user.id; end - это так называемый одноэлементный метод (подробнее о здесь ).Теперь по умолчанию вы не можете получить доступ к переменным экземпляра (например, @temp) внутри одноэлементного метода.

Есть несколько способов обойти это, но если вы не хотите специальноПо вашему мнению, одноэлементный метод (и почему вы?), я бы порекомендовал альтернативный способ установки значения предварительного выбора.В вашем примере это должно быть так просто:

<% form_for :user do |form| %>
  <%= form.select(:name, %w{ Andy Bert Chas Dave Eric Fred }, {:selected => @temp}) %>
<% end %>

как sidenote;@var - это переменная instance в Ruby, а не глобальная переменная.Глобальные переменные начинаются со знака доллара ($var), но не используйте его, если вы не знаете, что делаете.

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