我有一个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的表单中完成所有这些操作。
我希望这有助于理解这个问题。
谢谢大家
答案 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 #1和Nested 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)
我将您的基本用例视为:
# 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