2014-09-12 5 views
2

Я ищу много в этих вопросах, но я действительно не вижу мою проблему, и я надеюсь, что будет ...Я думаю, что я бездельничал ... Рельсы PARAMS

(я привык к коду в C, C++ и т. д., но я новичок в рельсах ...)

У меня есть вид sign_up, и когда я отправляю, рельсы автоматически устанавливают все поля пользователя, которые заполняются в форме. Это круто, но теперь я хочу создать новое текстовое поле и взять то, что пользователь вводит в качестве текста в этом текстовом поле, и использует его позже, не задавая поля другого пользователя, мне сказали использовать before_create и params или что-то в этом роде, м нуб ... В Haml:

do |f| 
    = f.text_field :email, :placeholder => "email" 

хорошо работает (он установлен в поле электронной почты с тем, что входит пользователь)

do |f| 
    = f.text_field NewVarThatIsNotAFieldOfCurrentNewUser, :placeholder => "referral code" 

Тогда OFC, эта ошибка происходит.

Error : undefined local variable or method `NewVarThatIsNotAFieldOfCurrentNewUser' (for the user class ofc) 

Если вы хотите получить больше информации/код, который я буду редактировать этот вопрос :)

Спасибо заранее!

ответ

4

Руби/Rails является гораздо проще, чем C++

Вам не нужно «объявлять» новые переменные каждый раз, когда вы хотите их использовать - вы просто заполняете их, чтобы их разглядывать. Кроме того, Ruby/Rails - object orientated, что означает, что все, что вам нужно, должно основываться на объектах.


Var

Ваша ошибка формулируется как например:

undefined local variable or method `NewVarThatIsNotAFieldOfCurrentNewUser' 

Что это означает, что вы пытаетесь загрузить переменную, которую вы еще не создали. Я упомянул, что вам не нужно объявлять переменные так же, как и C++, но вам необходимо заполнить их данными или, по крайней мере, получить их для вашего приложения.

Для этого вы должны указать, Мне нужно объявить &, заполнив переменную в вашем контроллере, хотя это приводит меня к следующему пункту - относительно контекста, в котором вы пытаетесь использовать эту переменную.

-

Объекты

В Rails/рубин является объектно-ориентированным, то это означает, что все, что вы делаете потребности сосредоточены вокруг объектов. Вот почему ваша ошибка заявляет 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, что означает, что она не будет сохранена в базе данных (как база данных не поддерживается соответствующий атрибут)


Fix

Если вы хотите, чтобы собрать данные для "нового" атрибут-й е пользователи не имеют данных (что до сих пор в базе данных), вы, вероятно, хотите использовать следующее:

#app/views/users/sign_up.html.erb 
<%= form_for @user do |f| %> 
    <%= f.text_field :attribute %> 
    <% end %> 
<% end %> 

В отношении того, что вы спрашиваете - я считаю, что метод attr_accessor является наиболее кв. Это даст вам возможность «повторно использовать» предоставленные данные, не полагаясь на их хранение в базе данных.

-

MVC

Наконец, чтобы дать вам больше контекста - я не знаю, как вы знакомы с MVC (я полагаю, относительно), но я полагал, что я дам вам некоторые идеи о том, как Rails приложения работают:

enter image description here

MVC означает, что у вас есть Model, view и Controller. Все они работают вместе, чтобы обеспечить базовый уровень функциональности для вашего приложения - предоставляя вам возможность редактировать данные из вашей базы данных &.

Я упоминаю об этом, потому что, если вы можете оценить, как Rails работает с архитектурной точки зрения, вы будете в гораздо лучшем положении, чтобы использовать его. Например, вы упомянули, что вас путают с before_create, а затем пометьте вопрос before_action.

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

- before_create для вашего Model

- before_action для вашего Controller

2

Вы можете использовать FormTagHelper модуль для создания «тегов формы, которые не полагаются на активном объекте записи»:

= text_field_tag 'your_independent_field' 

Это будет доступно как params[:your_independent_field] в контроллере.

+0

You рок человек! Я попробую это :) – Charlon

1

Проверить http://apidock.com/rails/ActionView/Helpers/FormTagHelper/text_field_tag способ. В рельсах, если вы создаете форму, как:

= form_for @some_obj do |f| 

Than каждое поле, созданное с обозначением f.something (как f.text_field, f.submit) будет связаны с @some_obj объектом. Поэтому, когда вы отправляете форму все поля значения будут доступны PARAMS хэш с Params [: some_obj] (например, Params [: что-то] [: адрес электронной почты])

Вы можете использовать что-то вроде:

= form_for @some_obj do |f| 
    = text_field_tag 'some_custom_param' 
    = f.text_field :something 

И после того, как отправить ваш PARAMS хэш будет:

params[:some_obj][:something] # => will hold value of :something text field 
params[:some_custom_param] # => will hold value of 'some_custom_param' text field ;) 
Смежные вопросы