我想我在乱搞...... Rails params

时间:2014-09-12 09:06:52

标签: ruby-on-rails ruby ruby-on-rails-3 params before-filter

我在这些问题中搜索了很多,但我并没有真正看到我的问题,我希望我会...

(我习惯用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)

如果您想了解更多信息/代码,我将编辑此问题:)

提前谢谢!

3 个答案:

答案 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应用程序如何工作的想法:

enter image description here

MVC表示您有ModelviewController。这些都协同工作,为您的应用程序提供基本级别的功能 - 为您提供创建和创建的能力。编辑数据库中的数据。

我之所以提到这一点,是因为如果你能从建筑的角度欣赏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 ;)