繁体   English   中英

Ruby on Rails 两个同时对两个不同的控制器创建操作

[英]Ruby on Rails two create actions to two different controllers simultaneously

我有一个线程 controller 和消息 controller。

线程 has_many 消息

用户单击发送后,我将数据发送到线程 controller 以创建线程。 我想做到这样

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

因此,如果第一个成功,基本上我会尝试一个接一个地执行两个 POST。

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

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

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

感谢大家

我认为你正在以错误的方式解决这个问题。

第一:我真的希望你不要调用 model Thread ,因为这会与 Ruby class Thread冲突。 如果是,请选择不同的词

现在有了“请将枪对准的脚”的信息......


您不应该调用MessagesController为 controller 创建新消息。相反,您应该在新的线程形式中使用嵌套属性:

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

在您的DiscussionThread (我在这里假设它的名称)model 中,您将拥有这些行:

has_many :messages
accepts_nested_attributes_for :messages

您可能还必须将messages_attributes添加到此 model 中的attr_accessible属性。

这告诉DiscussionThread model 实例也可以接受messages关联的属性。 在您的ThreadsController中,操作将保持不变。

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

如果我理解你的问题,你只需要调用Message model的create方法并传入相关信息即可。 所以在你的 if @thread.save 中是这样的:

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

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

没有理由将 go 换成另一个 controller。您可以在线程 controller go 中:

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

或者在消息 controller 中执行此操作,这对我来说更有意义,因为您的用户正在创建消息,而线程创建作为副作用。 如果您正确发送thread_id ,在params[:message][:thread_id]中,关联将在您创建 object 时自动建立:

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

如果您需要一些其他逻辑来决定消息与哪个线程相关联,只需直接设置thread_id即可:

@message.thread_id = current_thread.id # Or Thread.create(...) or whatever
@message.save

我将您的基础用例视为:

  • 创建新消息和线程
  • 在现有线程中创建新消息
  • 查看消息
  • 查看线程和所有关联的消息

我会建议多对多关系: 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM