Rails: 显示从一个模型到另一个模型视图的创建表单

Rails: display create form from one model into another model view

抱歉,如果这是一个愚蠢的问题,我不是经验丰富的 Rails 开发人员。

据我了解,Rails 的处理方式是:

不过我不明白的是,我们是否可以将两个模型相互混合。

例如,在我们的应用程序中,我们有一个用户模型、一个日历模型和一个 Post 模型。

一个用户有很多日历,一个日历有很多 posts。

我们需要让人们:

我们实现这一目标的方式是:

但是,我们不确定这是正确的 /Rails 做事方式,感觉我们可能会破坏 MVC 模式。

如果是这种情况,是否有一种解决方案可以实现类似的结果,但采用更传统的方法?

可以将表单放在任何地方,但通常要确保将表单提交到正确的端点。如果 calendarpost 的形式不同,您会希望将它们 post 编辑为 CalendarsControllerPostsController

例外情况通常是您的模型中有 accepts_nested_attributes_for。例如。如果 class Calendaraccepts_nested_attributes_for :posts,你可以让 CalendarsControllerCalendar.new(posts: {description: 'Foo'}) 并且日历和 post 都会立即保存。

它帮助我首先想到 REST 操作(想想你的日历形式 posting 到 /calendars,等等),而控制器只是代表你可以在模型的命令行(创建模型记录等)。这种方法还可以让您在模型中尽可能多地考虑 "fat model/thin controller" 和抽象。

要从用户个人资料创建日历,您首先需要在 UsersController 显示操作中定义 @calendar

def show
  @calendar = Calendar.new
end

在你的表单中,你可以使用@calendar,这与调用form_for Calendar.new

是一样的
= form_for @calendar do |f| 
  = hidden_field_tag "user_id", @user.id # passing in user_id as a param

现在,在 CalendarsController 中的 create 操作中,您可以使用 user_id 参数将日历设为 belong_to 用户。

def create
  calendar = Calendar.new(calendar_params)
  calendar.user_id = params[:calendar][:user_id]
  calendar.save
end

您也可以使用 accept nested_attributes,但以上内容可能解释了 MVC 和关联的工作原理。对其他模型采用相同的方法。希望这可以帮助。