很抱歉,如果这是一个愚蠢的问题,我不是一个经验丰富的Rails开发人员。
据我所知,Rails的做事方式是:
我不明白的是,我们是否可以将两个模型相互混合。
例如,在我们的应用程序中,我们有一个User模型,一个Calendar模型和一个Post模型。
用户有许多日历,日历有很多帖子。
我们需要让人们:
我们完成此任务的方式是:
_calendar_form.html.erb
表单并将其包含在我们的用户show.html.erb
中。_post_form.html.erb
表单并将其包含在我们的日历show.html.erb
中。但是,我们不确定这是正确/ Rails的做事方式,并且觉得我们可能会破坏MVC模式。
如果是这种情况,是否有解决方案可以实现类似的结果,但采用更传统的方法?
答案 0 :(得分:1)
将表单放在任何地方都是可以接受的,但通常一定要将表单提交到正确的终端。如果calendar
和post
采用不同的形式,您可能希望将其发布到CalendarsController
和PostsController
。
例外情况通常是模型中有accepts_nested_attributes_for
。例如。如果class Calendar
有accepts_nested_attributes_for :posts
,您就可以CalendarsController
执行Calendar.new(posts: {description: 'Foo'})
,并且日历和帖子都会立即保存。
这有助于我首先考虑REST操作(认为您的日历表单发布到/calendars
等),并且控制器只是代表您可以在模型的命令行上执行的操作(创建模型记录等)。这种方法也让你在模型中尽可能多地考虑“胖模型/瘦控制器”和抽象。
答案 1 :(得分:1)
要从用户个人资料中创建日历,您首先需要在@calendar
展示操作中定义UsersController
。
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
现在,您在create
CalendarsController
行动中可以使用user_id
参数将日历归属于用户。
def create
calendar = Calendar.new(calendar_params)
calendar.user_id = params[:calendar][:user_id]
calendar.save
end
您也可以使用accept nested_attributes,但上面的内容可能会解释MVC和关联的工作原理。对于其他模型,请遵循相同的方法。希望这可以帮助。