【问题标题】:How to pass Devise's current_user as user_id?如何将设计的 current_user 作为 user_id 传递?
【发布时间】:2011-12-12 09:41:19
【问题描述】:

我正在通过创建一个简单的应用程序来练习我的 Ruby on Rails,用户可以在其中注册(使用 Devise)并发布文章。

安装Devise后,我继续为文章生成一个脚手架

 rails g scaffold article title:string article:text user_id:integer

然后我创建 Devise 用户控制器

rails generate devise User

我的文章控制器:

class Article < ActiveRecord::Base
    belongs_to :user
end

我的用户控制器:

class User < ActiveRecord::Base
  has_many :articles

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me
end

现在我的问题是:如何让http://localhost:3000/articles/new/ 中的 user_id 自动成为 current_user.id?

此外,在http://localhost:3000/articles/ 中,用户应该只能查看与其 user_id 关联的文章,而不能查看其他任何人。为此,我应该对文章控制器进行哪些更改?

这是我第一次在 Stack Overflow 上发帖,非常感谢您的帮助.. 非常感谢!

EDIT找到第一个问题的解决方案,以备日后参考。

我放了

<%= f.hidden_field :user_id %> 

在_form.html.erb中,和

def create
    @article.user_id = current_user.id 
    ...
end

到我的文章控制器。这样就成功地将 current_user.id 作为文章的 user_id 完美传递了。

【问题讨论】:

  • 请更具体。你没有什么意义。
  • 我认为我已经尽可能地解释了它。但是好的,TL;博士 --> 文章表有 3 个字段(标题、文章和 user_id)。我在问创建表单中的user_id如何=来自Devise的current_user.id。

标签: ruby-on-rails devise


【解决方案1】:

现在我的问题是:如何让http://localhost:3000/articles/new/ 中的 user_id 自动成为 current_user.id?

您应该在articles_controller 的“def new”中添加这一行 @ask.user_id = current_user.id

然后form_for @ask 请求@askuser_id 属性并显示它。但我不建议在实际应用中执行此操作,您可能会在 `articles_controller

的“def create”中处理此步骤

`另外,在http://localhost:3000/articles/ 中,用户应该只能查看与其user_id 关联的文章,而不能查看其他任何人。为此,我应该对文章控制器进行哪些更改?

articles_controllerdef index 内,更改为@articles = Article.where(user_id:current_user.id)。请注意,您还应该添加before_filter :require_user 以确保current_user 不为零。

【讨论】:

  • ^^ 谢谢。我想我想通了。我将 放在 _form.html.erb 和 @article.user_id = current_user.id 下 article_controller 的“def create”,这完美地将 current_user.id 作为文章的 user_id 传递。您的第二个解决方案是有道理的;我现在就试一试。
  • @cdotfeli 在表单中设置 user_id 而之后不检查它意味着您可以通过手动 POST 请求来模拟您网站的任何用户。
  • @P.S.V.R.您的第二个解决方案有效!非常感谢。我现在去添加 before_filter :require_user。
  • @BenoitGarret 所以我不应该将 user_id 作为表单中的隐藏字段传递?我应该怎么做?抱歉,我是新手。
  • @cdotfeli 抱歉,我误读了您的解决方案。你实际上并没有在你的控制器中使用hidden_form 标签(如果你使用params[:article][:user_id],你会这样做)。 @article.user_id = current_user.id 是完美的,但你不需要其他任何东西。
【解决方案2】:

在您的 ArticleController#new 操作中添加以下行:
@article = current_user.articles.build

至于您的索引操作:
@articles = current_user.articles

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2010-09-26
    • 2021-01-16
    相关资源
    最近更新 更多