0

对不起,如果这是一个愚蠢的问题,我不是一个经验丰富的Rails开发人员。Rails:显示从一个模型创建表单到另一个模型视图

据我了解,做事情的Rails的方式是:

  • 创建一个模型。
  • 通过创建,显示等操作为此模型创建一个控制器。
  • 通过具有相应名称(例如new.html.erb,show.html.erb等)的相关视图呈现这些操作。
  • 将视图路由到路由器所需的URL。

我不明白,但我们是否可以混合两个模型彼此。

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

用户有很多日历,日历中有很多帖子。

而且我们需要让人们:

  • 创建一个从他们的个人资料(用户#显示)的新@calendar。
  • 从日历中创建一个新的@post。

我们来完成,这是顺便说一句:

  • 创建_calendar_form.html.erb形式,包括到我们用户的show.html.erb
  • 创建_post_form.html.erb表单并将其包含到我们的日历的show.html.erb中。

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

如果是这样,是否有解决方案来实现类似的结果,但采用更传统的方法?

回答

1

要根据用户配置文件创建日历,首先需要在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 

现在,在您create行动CalendarsController可以使用user_id PARAMS使日历belong_to用户。

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

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

+0

完美,谢谢! –

1

可以随时随地放置表单,但通常会确保将表单提交给正确的端点。如果calendarpost的格式不同,则您希望将它们发布到CalendarsControllerPostsController

例外情况通常是在模型中有accepts_nested_attributes_for。例如。如果class Calendaraccepts_nested_attributes_for :posts,那么您可以使CalendarsController做到Calendar.new(posts: {description: 'Foo'}),并且日历和帖子都会立即保存。

它可以帮助我首先考虑REST操作(认为您的日历表单发布到/calendars等),并且控制器仅仅是您可以在模型的命令行上执行的代理(创建模型记录等)。这种方法还可以让您在模型中尽可能多地考虑“胖模型/瘦控制器”和抽象。

+0

感谢您的解释。 –

相关问题