Rails: 显示从一个模型到另一个模型视图的创建表单
Rails: display create form from one model into another model view
抱歉,如果这是一个愚蠢的问题,我不是经验丰富的 Rails 开发人员。
据我了解,Rails 的处理方式是:
- 创建模型。
- 为此模型创建一个控制器,包括创建、显示等操作
- 通过具有相应名称的相关视图呈现这些操作,例如new.html.erb、show.html.erb等
- 使用路由器将视图路由到所需的URL。
不过我不明白的是,我们是否可以将两个模型相互混合。
例如,在我们的应用程序中,我们有一个用户模型、一个日历模型和一个 Post 模型。
一个用户有很多日历,一个日历有很多 posts。
我们需要让人们:
- 从他们的个人资料 (users#show) 创建一个新的@calendar。
- 从日历创建新的@post。
我们实现这一目标的方式是:
- 正在创建一个
_calendar_form.html.erb
表单并将其包含到我们的用户 show.html.erb
中。
- 正在创建一个
_post_form.html.erb
表格并将其包含在我们的日历 show.html.erb
中。
但是,我们不确定这是正确的 /Rails 做事方式,感觉我们可能会破坏 MVC 模式。
如果是这种情况,是否有一种解决方案可以实现类似的结果,但采用更传统的方法?
可以将表单放在任何地方,但通常要确保将表单提交到正确的端点。如果 calendar
和 post
的形式不同,您会希望将它们 post 编辑为 CalendarsController
和 PostsController
。
例外情况通常是您的模型中有 accepts_nested_attributes_for
。例如。如果 class Calendar
有 accepts_nested_attributes_for :posts
,你可以让 CalendarsController
做 Calendar.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 和关联的工作原理。对其他模型采用相同的方法。希望这可以帮助。
抱歉,如果这是一个愚蠢的问题,我不是经验丰富的 Rails 开发人员。
据我了解,Rails 的处理方式是:
- 创建模型。
- 为此模型创建一个控制器,包括创建、显示等操作
- 通过具有相应名称的相关视图呈现这些操作,例如new.html.erb、show.html.erb等
- 使用路由器将视图路由到所需的URL。
不过我不明白的是,我们是否可以将两个模型相互混合。
例如,在我们的应用程序中,我们有一个用户模型、一个日历模型和一个 Post 模型。
一个用户有很多日历,一个日历有很多 posts。
我们需要让人们:
- 从他们的个人资料 (users#show) 创建一个新的@calendar。
- 从日历创建新的@post。
我们实现这一目标的方式是:
- 正在创建一个
_calendar_form.html.erb
表单并将其包含到我们的用户show.html.erb
中。 - 正在创建一个
_post_form.html.erb
表格并将其包含在我们的日历show.html.erb
中。
但是,我们不确定这是正确的 /Rails 做事方式,感觉我们可能会破坏 MVC 模式。
如果是这种情况,是否有一种解决方案可以实现类似的结果,但采用更传统的方法?
可以将表单放在任何地方,但通常要确保将表单提交到正确的端点。如果 calendar
和 post
的形式不同,您会希望将它们 post 编辑为 CalendarsController
和 PostsController
。
例外情况通常是您的模型中有 accepts_nested_attributes_for
。例如。如果 class Calendar
有 accepts_nested_attributes_for :posts
,你可以让 CalendarsController
做 Calendar.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 和关联的工作原理。对其他模型采用相同的方法。希望这可以帮助。