3

我想了解设计 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。

4

3 回答 3

0

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

帖子没有保存,因为它找不到讨论。由于您在 Post 控制器而不是 Discussion 上,因此您需要寻找与

@discussion = Discussion.find(params[:discussion_id])

您搜索它的 :id 来自帖子的参数。它没有找到任何东西,因为您可能有更多讨论的帖子。如果它确实找到了一些东西,那就是找到了错误的东西。

使嵌套路由工作的检查清单上的另一件事是使路由正确。用“rake routes”检查它们,但它应该如下所示:

resources @discussions do
   resources @posts
end

这将添加路由,以便您的表单(看起来应该类似于<%= form_for [@discussion, @post] do |f| %>可以发布/放入讨论帖子路径)。

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

于 2013-01-29T01:57:16.077 回答
0

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

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

那对你有用吗?

于 2013-01-27T15:00:22.080 回答
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 ...
于 2013-01-27T14:56:32.320 回答