2

我有一个线程控制器和消息控制器。

线程 has_many 消息

一旦用户单击发送,我将数据发送到线程控制器以创建线程。我想做到这一点

线程控制器.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。

我认为 redirect_to 是我应该使用的。是否可以使用 redirect_to 传递参数并从不同的控制器调用创建操作?

编辑:我必须有一个线程(由于 Ryan 提到的原因,名字选择不好,但为了不让人们与底部的答案混淆,让我们保留它)模型和消息模型在这里。线程表只需要传入message_title即可。Message表包含from_id(发送消息的用户id)、to_id(接收消息的用户id)和message_content。我正在尝试以一种包含 message_title 和 message_content 的形式来完成所有这些工作。

我希望这有助于理解这个问题。

谢谢大家

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的行动将保持不变。

有关嵌套属性的更多信息,我建议观看 Railscasts on Nested Forms #1Nested Forms #2

于 2012-04-07T22:06:22.747 回答
0

如果我理解您的问题,您需要做的就是调用 Message 模型上的 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 回答