Ruby on Rails两个同时为两个不同的控制器创建动作

时间:2012-04-07 21:35:15

标签: ruby-on-rails ruby-on-rails-3 controller

我有一个Threads控制器和Messages控制器。

主题has_many消息

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

threads_controller.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传递params并从另一个控制器调用create action?

编辑: 我必须有一个线程(由于Ryan提到的原因而选择了错误的名称,但为了不让人们对底层的答案感到困惑,让我们保留它)模型和消息模型在这里。线程表只需要接收message_title。 Message表接收from_id(用户发送消息的id),to_id(用户接收消息的id)和message_content。我试图在一个接收message_title和message_content的表单中完成所有这些操作。

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

谢谢大家

4 个答案:

答案 0 :(得分: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中,操作将保持不变。

有关嵌套属性的详细信息,建议您在Nested Forms #1Nested Forms #2上观看Railscast。

答案 1 :(得分:0)

如果我理解你的问题,你需要做的就是在Message模型上调用create方法并传入相关信息。所以在你的if @ thread.save中就是这样的东西:

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

如果您不想使用此路由,则可以使用嵌套资源,然后在传递正确信息时让Rails自动创建新消息。

答案 2 :(得分: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

答案 3 :(得分: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