代码之家  ›  专栏  ›  技术社区  ›  Charlon

我想我在胡闹。。。轨道参数

  •  2
  • Charlon  · 技术社区  · 10 年前

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

    (我习惯于用C、C++等语言编写代码……但我是一个新手……)

    我有一个sign_up视图,当我提交时,rails自动设置表单中填写的用户的每个字段。这很酷,但现在我想创建一个新的text_field,并将用户在这个text_field中输入的内容作为文本,稍后使用它,而不设置任何其他用户的字段。我被告知要使用before_create和params或类似的东西,但然后我是一个noob。。。 在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 回复  |  直到 10 年前
        1
  •  4
  •   Richard Peck    10 年前

    Ruby/Rails是 比C简单++

    您不需要在每次使用新变量时都“声明”它们,只需填充它们即可对它们进行建模。此外,Ruby/Rails是 object orientated ,这意味着您所做的一切都需要基于对象。


    变量

    您的错误如下所述:

    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 %>
    

    关于你的问题-我相信 属性访问器 方法是最合适的。这将使您能够“重用”提交的数据,而无需将其存储在数据库中。

    --

    MVC模式

    最后,再给你一些背景——我不知道你有多熟悉 MVC (我认为相对而言),但我想我会给你一些关于Rails应用程序如何工作的想法:

    enter image description here

    MVC意味着你有一个 Model , view Controller 这些都可以一起工作,为您的应用程序提供基本级别的功能—为您提供创建&编辑数据库中的数据。

    我之所以提到这一点,是因为如果你能从体系结构的角度理解Rails的工作方式,你就可以更好地利用它 before_create ,然后用 before_action .

    这两个回调服务于Rails框架的不同部分,因此不会执行相同的功能。

    -- before_create 是给你的 模型

    -- before_action 是给你的 控制器

        2
  •  2
  •   Stefan    10 年前

    您可以使用 FormTagHelper 要创建的模块 “不依赖活动记录对象的表单标记” :

    = text_field_tag 'your_independent_field'
    

    这将作为 params[:your_independent_field] 在您的控制器中。

        3
  •  1
  •   Kuba Płoskonka    10 年前

    检查 http://apidock.com/rails/ActionView/Helpers/FormTagHelper/text_field_tag 方法 在轨道中,如果创建的形状如下:

    = form_for @some_obj do |f|
    

    然后,用符号f.some创建的每个字段(如f.text_field、f.submit)都将与@some_obj对象关联。因此,当您发送表单时,所有字段值都可以从params hash和params〔:some_obj〕(例如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 ;)