我在这些问题中搜索了很多,但我并没有真正看到我的问题,我希望我会...
(我习惯用C,C ++等编写代码......但我是rails中的新手......)
我有一个sign_up视图,当我提交时,rails会自动设置用户填写表单的每个字段。这很酷但现在我想创建一个新的text_field并将用户输入的内容作为text_field中的文本并在以后使用它而不设置任何其他用户的字段,我被告知使用before_create和params或类似的东西然后我'是一个菜鸟...... 在haml:
do |f|
= f.text_field :email, :placeholder => "email"
效果很好(它使用用户输入的内容设置电子邮件字段)
do |f|
= f.text_field NewVarThatIsNotAFieldOfCurrentNewUser, :placeholder => "referral code"
然后,这个错误发生了。
Error : undefined local variable or method `NewVarThatIsNotAFieldOfCurrentNewUser' (for the user class ofc)
如果您想了解更多信息/代码,我将编辑此问题:)
提前谢谢!
答案 0 :(得分:4)
Ruby / Rails 比C ++
更简单每次要使用它们时都不需要“声明”新变量 - 只需填充它们以便对它们进行delcare。此外,Ruby / Rails是object orientated,这意味着你所做的一切都需要基于对象。
<强>无功强>
您的错误如下:
undefined local variable or method `NewVarThatIsNotAFieldOfCurrentNewUser'
这意味着您正在尝试加载尚未创建的变量。我提到你不需要像C ++一样声明变量,但你做需要用数据填充它们,或者至少让它们可以被你的应用访问
为了做到这一点,你需要申报&amp;填充控制器中的变量,虽然这会让我进入下一点 - 关于您尝试使用变量的上下文。
-
<强>物件强>
由于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
答案 1 :(得分:2)
您可以使用FormTagHelper
模块创建不依赖于Active Record对象的“表单标记”:
= text_field_tag 'your_independent_field'
这将在您的控制器中以params[:your_independent_field]
显示。
答案 2 :(得分:1)
检查http://apidock.com/rails/ActionView/Helpers/FormTagHelper/text_field_tag方法。 在rails中,如果您创建如下形式:
= form_for @some_obj do |f|
与使用符号f.something(如f.text_field,f.submit)创建的每个字段相比,将与@some_obj对象关联。因此,当您发送表单时,所有字段的值都可以使用参数[:some_obj]从params散列访问(例如params [:something] [:email])
您可以使用以下内容:
= form_for @some_obj do |f|
= text_field_tag 'some_custom_param'
= f.text_field :something
发送你的参数后,哈希将是:
params[:some_obj][:something] # => will hold value of :something text field
params[:some_custom_param] # => will hold value of 'some_custom_param' text field ;)