[英]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 #1和Nested 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
我将您的基础用例视为:
# 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.