通过Rails中的current_user访问数据库字段

时间:2014-09-17 16:30:10

标签: ruby-on-rails ruby database

我对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时,它不会输出任何内容,但是因为没有设置任何值,所以我会下注。 所以:

如何在用户第一次注册时设置值?

对于问题方向的微小改变感到抱歉 - 我希望没问题。

1 个答案:

答案 0 :(得分:1)

<强>辅助

current_user对象只是一个帮助程序,它使您能够调用已登录用户的User对象。没有比这更多了

凭借这一点,您需要了解当您调用current_user时,它基本上将使用与调用标准User对象时完全相同的值/变量。因此,example_field_name 应该在您想要调用时

简而言之,如果你已经正确地完成了所有事情,那么它将对你有用

-

<强>移植

您可能遇到的问题包括:

  
      
  1. 迁移未正常启动
  2.   
  3. 您的field_name与rails中的某些保留方法名称冲突(不太可能)
  4.   
  5. 您的语法错误
  6.   

从您提供的代码判断,我将排除语法错误,并且您的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