【问题标题】:Referencing the current user in Ruby on Rails在 Ruby on Rails 中引用当前用户
【发布时间】:2015-01-24 22:20:33
【问题描述】:

所以我在http://railscasts.com/episodes/250-authentication-from-scratch 使用了“从头开始的身份验证”railscast 中的逻辑,它似乎有效,我可以在页面顶部粘贴“您以...身份登录”消息。

但如果我想做一些事情,比如记录谁提交了一篇文章,我就有点碰壁了。

我不想通过新帖子表单中的隐藏字段提交它,因为我猜这存在安全问题。

我不想在http://ruby.railstutorial.org/ruby-on-rails-tutorial-book 的 rails 教程中使用“属于”逻辑,因为虽然它在技术上可以在这里工作,但我将来可能需要记录谁创建了“属于”的条目关系不存在。

我尝试做的是在我的帖子模型中创建一个“保存前”函数调用,该函数调用分配一个“created_by”值,但我猜模型无法访问根据身份验证 railscast 创建的 current_user。

所以现在我不知道如何做这样的事情。

编辑:Ruby 新手,ERD 新手,所有这些,但我所说的属于关系不存在的意思是,如果有一个帖子评级系统,每个评级都属于一个帖子。但我也想记录谁提交了每个评级。

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

如果我很好理解您遇到的问题是您无法在模型中使用current_user 辅助方法查看当前正在登录的用户,您可以在@987654323 中设置帖子的created_by 属性@controller 之前保存它,类似于:

def create
  @post = Post.new(params[:post])
  @post.created_by = current_user.id
  if @post.save
    redirect_to whereyouwant_url, :notice => "Post successfully created"
  else
    render "new"
  end
end

【讨论】:

  • 谢谢,我怀疑这样的事情应该是可能的,甚至可能以前看过一个例子,但到目前为止,Rails 有点压倒性。很确定这正是我所需要的。
  • 在更新过程中,我们也需要通过这个吗?因为我在更新时删除了 created_by .. :(
【解决方案2】:

好的,不确定存在什么并发症,但这里是:

所以添加一个belongs_to 使帖子有一个名为user_id 的字段,它是用户ID 的外键。如果你添加了一个创建者,这将做同样的事情,除了你必须自己编程更新和取消引用。我认为这可能是获得此功能的最佳方式,您只需稍后将其添加到没有它的部分,但 rails 使它变得容易。

class User < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user, :as => :created_by
end



post.created_by
user.posts

会让你访问那个用户,这是否等同于使用你所说的,除了 rails 会发挥它的魔力并为你添加方法。

编辑:如果这对你不起作用,抱歉你的问题不清楚你为什么需要某些东西,但你总是可以很容易地添加属于关系,这就是我的建议。

【讨论】:

  • 从技术上讲,这是可行的,而且我没有遇到任何问题。我担心的是,如果我在其他领域需要多个外键,这将是一个问题。例如,如果我有帖子评分,我需要每个评分都属于一个帖子,但我还想要一个记录谁提交每个评分的日志。是否可以有多个“属于”关系并以这种方式填充两个外键?
  • 据我了解,可以。我有 4 个属于和 2 个 has_manys 的模型,您只需添加更多列,post_id、submitter_id、rating_id 等
【解决方案3】:

(Aldo 'xoen' Giambelluca 的替代答案)

我认为你应该使用像loosecannon 解释的belongs_to 关系,但如果你真的不想要,在你的User 类中添加以下方法:

def new_post(params)
  post = Post.new(params)
  post.created_by = id 
  post
end

在你的控制器中:

def create
  @post = current_user.new_post(params[:post])
  if @post.save
    redirect_to @post, notice: 'Post successfully created'
  else
    render 'new'
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多