如何设计current_user工作?

时间:2013-01-27 14:22:32

标签: ruby-on-rails devise

我想了解设计current_user方法是如何工作的,因为我想将它推广到其他允许代码如current_forum或current_forum_thread的模型。

更具体地说,我正在尝试在Rails中实现聊天论坛。我有一个页面显示特定讨论主题的所有帖子(目前没有)。同一页面嵌入了新的帖子表格。调试(参数)显示:

action: show
controller: discussions
forum_id: '1'
id: '1'

discussion: !ruby/object:Discussion
  attributes:
    id: 1
    title: first discussion (thread)
    forum_id: 1

因此,posts控制器中的create方法应该知道讨论ID是什么。然而,控制器中的这段代码不起作用。

  1. @discussion = Discussion.find(params[:id])
  2. @post = @discussion.posts.new(params[:post])
  3. if @post.save
  4.  flash[:success] = "Discussion post created!"
  5.  redirect_to '#'
  6. else
  7.  render '#'
  8. end

第1行引发错误:

Couldn't find Discussion without an ID

此外,在检查时发现@discussion变量始终为NIL。

3 个答案:

答案 0 :(得分:0)

我将before_filter :authenticate_user!置于每个控制器之上,然后执行以下操作:

current_user.posts.new(params)

这也需要关系User has_many :posts

似乎工作(不确定这是否是最佳方式)。

此外,您的错误似乎意味着您的prarms [:id]为零,因此请检查它是否正确传递。您应该能够在日志中看到它。

# Discussions controller - show action
@discussion = Discussion.find(params[:id])
render ...

# Discussion show view
%ul
  - @discussion.posts.each do |post|
    %li= post.content # to output list of posts
= form_for @discussion.posts.new do |f|
  = f.input :content
  = f.submit
  # form to create new post related to this discussion

# Post controller - create method
@post = Post.new(params[:id])
@post.save!
render ...

答案 1 :(得分:0)

我认为它更像是一个辅助函数,设计方法是通过会话获取ID,但你可以通过params hash做同样的事情, 即

module ApplicationHelper
  def current_forum_thread
   Thread.find(params[:id])
  end
end

这对你有用吗?

答案 2 :(得分:0)

对于此实现,将current_id与线程一起使用似乎过于复杂,因为它看起来像一个非常简单的嵌套资源。

该帖子未保存,因为无法找到讨论。由于您使用的是Post控制器而非讨论,因此您需要使用

查找讨论
@discussion = Discussion.find(params[:discussion_id])

:您使用帖子的参数来搜索它。它没有找到任何东西,因为你可能有更多的帖子讨论。如果确实发现了什么,就会发现错误的东西。

检查列表中使嵌套路由工作的另一个方法是使路由正确。用'rake routes'检查它们,但它应该是这样的:

resources @discussions do
   resources @posts
end

这将添加路由,以便您的表单看起来像<%= form_for [@discussion, @post] do |f| %>,可以发布/放入discussion_posts_path。

像你进入的那样使用current_id确实是一种范围,而且它有点混乱,Ryan Bate有一个关于多租户的精彩视频,范围http://railscasts.com/episodes/388-multitenancy-with-scopes