2

私は Threads コントローラーと Messages コントローラーを持っています。

スレッド has_many メッセージ

ユーザーが [送信] をクリックすると、データを Threads コントローラーに送信してスレッドを作成します。そうなるようにしたい

スレッドコントローラー.rb

def create
    ...
    if @thread.save
         #send data into messages_controller 
         #to create the corresponding table for a message with this thread_id

end

したがって、基本的に、最初の POSTS が成功した場合、2 つの POSTS を次々に実行しようとしています。

私はredirect_toが私が使用することになっているものだと思います。redirect_to を使用してパラメーターを渡し、別のコントローラーから作成アクションを呼び出すことは可能ですか?

編集:スレッド(ライアンが言及した理由で悪い名前の選択が必要ですが、下部の回答で人々を混乱させないために、そのままにしておきましょう)モデルとメッセージモデルをここに作成します。スレッド テーブルは、message_title のみを取得する必要があります。メッセージ テーブルは、from_id (メッセージを送信するユーザーの ID)、to_id (メッセージを受信するユーザーの ID)、および message_content を受け取ります。message_title と message_content を取り込む 1 つの形式でこれらすべてを実行しようとしています。

これが質問の理解に役立つことを願っています。

みんな、ありがとう

4

4 に答える 4

1

私はあなたがこれについて間違った方法で行っていると思います。

Threadまず、Rubyクラスと競合するため、モデルを呼び出さないことを強く望んでいますThread。もしそうなら、別の単語を選択してください

「銃を足から離してください」というメッセージが表示されます...


MessagesControllerコントローラの新しいメッセージを作成するためにを呼び出すべきではありません。代わりに、新しいスレッド形式でネストされた属性を使用する必要があります。

<%= form_for @thread do |f| %>
  <%= f.fields_for :messages do |message| %>
    <%= render "messages/form", :message => message %>
  <% end %>
<% end %>

DiscussionThread(ここではその名前を想定しています)モデル内に、次の行があります。

has_many :messages
accepts_nested_attributes_for :messages

messages_attributesこのモデルのattr_accessible属性にも追加する必要がある場合があります。

これは、インスタンスが関連付けDiscussionThreadの属性も受け入れることができることをモデルに通知します。messagesあなたThreadsControllerの行動では、その後同じままになります。

ネストされた属性の詳細については、ネストされたフォーム#1およびネストされたフォーム#2のRailscastを参照することをお勧めします。

于 2012-04-07T22:06:22.747 に答える
0

私があなたの質問を理解した場合、あなたがする必要があるのは、メッセージモデルのcreateメソッドを呼び出し、関連情報を渡すことだけです。したがって、if @ thread.saveには次のようなものがあります:

Message.create(:item_1 => params[:item_1])

このルートに行きたくない場合は、ネストされたリソースを使用し、正しい情報を渡したときにRailsが自動的に新しいメッセージを作成するようにすることができます。

于 2012-04-07T22:08:25.817 に答える
0

別のコントローラーに移動する理由はありません。スレッドコントローラーで次のいずれかを実行できます。

@thread.messages << Message.new(...)

または、メッセージコントローラで実行します。これは、ユーザーが副作用としてスレッドの作成を使用してメッセージを作成しているため、私にはより理にかなっています。thread_id適切に送信するparams[:message][:thread_id]と、オブジェクトを作成するときに関連付けが自動的に行われます。

@message = Message.create(params[:message]) 

メッセージが関連付けられているスレッドを決定するために他のロジックが必要な場合は、thread_id直接設定してください。

@message.thread_id = current_thread.id # Or Thread.create(...) or whatever
@message.save
于 2012-04-07T22:09:05.597 に答える
0

私はあなたの根本的なユースケースを次のように見ています:

  • 新しいメッセージとスレッドを作成する
  • 既存のスレッドに新しいメッセージを作成する
  • メッセージを見る
  • スレッドと関連するすべてのメッセージを表示

多対多の関係をお勧めします: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many

# define has and belongs to many relationship

class Message
  has_and_belongs_to_many :threads
end

class Thread
  has_and_belongs_to_many :messages
end

class MessageThread
  belongs_to :message
  belongs_to :thread
end

# use case: creating a new message and a new thread, showing message

class MessagesController < ApplicationController
  def create
    @message = current_user.messages.create! :text => params[:text]
    @thread = @message.threads.create!
  end

  def show; @message = current_user.messages.find(params[:id); end;
end

# use case: creating a message in an existing thread

def MessagesThreadsController < ApplicationController
  def create
    @thread = current_user.threads.find params[:id]
    @thread.messages.create! :text => params[:text]
  end
end

# use case: viewing all messages in a thread

def ThreadsController < ApplicationController
  before_filter :set_thread

  def show
    @thread = current_user.threads.find params[:id]
    @messages = @thread.messages
  end
end
于 2012-04-07T22:35:48.003 に答える