3

current_forum や current_forum_thread などのコードを許可する他のモデルに一般化したいので、devise current_user メソッドがどのように機能するかを理解したいと思います。

具体的には、Rails でチャット フォーラムを実装しようとしています。特定のディスカッション スレッドのすべての投稿 (現在はありません) を表示するページがあります。同じページに新しい投稿フォームが埋め込まれています。debug(params) は次を示します。

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

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

したがって、投稿コントローラーの 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.find(params[:discussion_id])

検索に使用する :id は、投稿のパラメーターからのものです。おそらくディスカッションよりもはるかに多くの投稿があるため、何も見つかりませんでした。何かを見つけたとしても、それは間違ったものを見つけていることになります。

ネストされたルートを機能させるためのチェック リストのもう 1 つのことは、ルートを正しく設定することです。「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

私はbefore_filter :authenticate_user!すべてのコントローラーの上に置いて、次のようなことをします:

current_user.posts.new(params)

これにも関係が必要ですUser has_many :posts

うまくいくようです(ただし、それが最善の方法かどうかはわかりません)。

また、あなたのエラーは prams[:id] が nil であることを意味しているようですので、正しく渡されているかどうかを確認してください。ログでそれを確認できるはずです。

# 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 に答える
0

私はそれがよりヘルパー関数だと思います.deviseの方法は、セッションを通じてIDを取得することですが、paramsハッシュを通じて同じことを行うことができます.

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

それはあなたのために働きますか?

于 2013-01-27T15:00:22.080 に答える