我对Ruby和Ruby on Rails相当新,所以请耐心等待......
我正在设计电子学习,我希望数据库跟踪用户的进度。用户可以登录,编辑他们的个人资料等;一切正常。
我已经通过
向数据库添加了一个新字段rails generate migration add_field_name_to_users example_field_name:int
rake db:migrate
我的问题是如何访问该字段值并将其显示在屏幕上。如何,或者我在哪里声明它?我假设它应该进入我的user.rb模型,但只是包含它就不会确保在用户第一次注册时将其设置为0。并且它不能只是一个局部变量,因为它必须存储在数据库中。另外,我怎么访问这个值呢? 我试过了:
<p>Progress: <%= current_user.example_field_name %>/10</p>
在适当的视图中,但是会抛出
undefined method `example_field_name' for #<User:0x4bc6738>
错误。我有权访问current_user(它本身并不会抛出错误),但我不知道如何访问新的字段值。
任何帮助,非常感谢。
编辑
根据要求,这是最后一个迁移文件:
class AddLeadershipStylesProgressToUsers < ActiveRecord::Migration
def change
add_column :users, :leadership_syles_progress, :int
end
end
是的,我刚刚意识到我错过了一个&#39;在&#39;样式&#39;。当我使用current_user.leadership_syles_progress时,它不会输出任何内容,但是因为没有设置任何值,所以我会下注。 所以:
如何在用户第一次注册时设置值?
对于问题方向的微小改变感到抱歉 - 我希望没问题。
答案 0 :(得分:1)
<强>辅助强>
current_user
对象只是一个帮助程序,它使您能够调用已登录用户的User
对象。没有比这更多了
凭借这一点,您需要了解当您调用current_user
时,它基本上将使用与调用标准User
对象时完全相同的值/变量。因此,example_field_name
应该在您想要调用时
简而言之,如果你已经正确地完成了所有事情,那么它将对你有用
-
<强>移植强>
您可能遇到的问题包括:
- 迁移未正常启动
- 您的
field_name
与rails中的某些保留方法名称冲突(不太可能)- 您的语法错误
醇>
从您提供的代码判断,我将排除语法错误,并且您的field_name
在Rails中保留。相反,我会专注于迁移,更具体地说,是迁移如何将各种列添加到数据库中。
我通常不清楚“生成”的迁移 - 我喜欢手动维护我的代码。因此,这就是我要做的事情:
> $ rails g migration NewField
#db/migrate/new_field_...rb
class NewField < ActiveRecord::Migration
def change
add_column :users, :your_field, :integer
end
end
> $ rake db:migrate
然后,您就可以使用Rails控制台验证这一点:
> $ rails c
> $ users = User.all
> $ [output of users with all attributes]
<强>更新强>
如果要在创建用户时设置额外字段,通常需要在模型中使用before_create
回调。这将创建一个默认值,然后您可以根据需要进行更改:
#app/models/user.rb
class Users < ActiveRecord::Base
before_create :set_field
private
def set_field
self.field = "your value"
end
end
如果您想在使用Devise时设置参数,则需要在表单中添加该字段,然后确保Devise params hash允许将值提交给您的模型:
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :your_field
end
end
-
<强>修正强>
为清楚起见,这最终对OP起作用了:
#app/models/user.rb
class Users < ActiveRecord::Base
before_create :set_field
private
def set_field
self.field = "your value"
end
end