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