Ruby/Rails намного проще, чем C++
Вам не нужно "объявлять" новые переменные каждый раз, когда вы хотите их использовать - вы просто заполняете их для того, чтобы их позаботиться. Кроме того, Ruby/Rails объектно-ориентированный, что означает, что все, что вы делаете, должно быть основано на объектах.
Вар
Ваша ошибка указана так:
undefined local variable or method `NewVarThatIsNotAFieldOfCurrentNewUser'
Это означает, что вы пытаетесь загрузить переменную, которую еще не создали. Я упомянул, что вам не нужно объявлять переменные так же, как в C++, но вам нужно заполнить их данными или, по крайней мере, сделать их доступными для вашего приложения.
Чтобы сделать это, вам нужно объявить и заполнить переменную в вашем контроллере, хотя это подводит меня к следующему пункту — относительно контекста, в котором вы пытаетесь использовать переменную.
--
Объекты
Поскольку Rails/Ruby является объектно-ориентированным, это означает, что все, что вы делаете, должно быть сосредоточено вокруг объектов. Вот почему ваша ошибка указывает local variable or method
-- у объектов есть «методы», а также данные
В любом случае, способ решить вашу проблему — убедиться, что атрибут, который есть у вашего пользователя, доступен, когда вы вызываете/создаете новый объект User
. Для этого я бы рекомендовал использовать attr_accessor
, хотя я не совсем уверен, что вы прошу быть честным.
Вот что я бы сделал:
#app/models/user.rb
class User < ActiveRecord::Base
attr_accessor :new_attribute
end
#app/views/users/sign_up.html.erb
<%= form_for @user do |f| %>
<%= f.text_field :new_attribute %>
<%= f.submit %>
<% end %>
Это создаст то, что известно как virtual attribute
, что означает, что он не будет сохранен в базе данных (поскольку база данных не поддерживает соответствующий атрибут)
Исправить
Если вы хотите собрать данные для «нового» атрибута, для которого у пользователя нет данных (который все еще находится в базе данных), вы, вероятно, захотите использовать следующее:
#app/views/users/sign_up.html.erb
<%= form_for @user do |f| %>
<%= f.text_field :attribute %>
<% end %>
<% end %>
Что касается того, о чем вы спрашиваете, я считаю, что метод attr_accessor
является наиболее подходящим. Это даст вам возможность «повторно использовать» отправленные данные, не полагаясь на их сохранение в базе данных.
--
MVC
Наконец, чтобы дать вам больше контекста - я не знаю, насколько вы знакомы с MVC (полагаю, относительно), но я решил дать вам несколько идей о том, как работают приложения Rails:
MVC означает, что у вас есть Model
, view
и Controller
. Все это работает вместе, чтобы обеспечить базовый уровень функциональности для вашего приложения, предоставляя вам возможность создавать и редактировать данные из вашей БД.
Я упоминаю об этом потому, что если вы понимаете, как работает Rails с архитектурной точки зрения, вы будете в гораздо лучшем положении, чтобы использовать его. Например, вы упомянули, что вас смущает before_create
, а затем отметили вопрос тегом before_action
.
Эти два обратных вызова обслуживают разные части фреймворка Rails и, следовательно, не будут выполнять одну и ту же функциональность.
-- before_create
для вашего Model
-- before_action
для вашего Controller
person
Richard Peck
schedule
12.09.2014