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

时间:2015-07-04 02:20:32

标签: ruby-on-rails ruby-on-rails-4 model-view-controller action conventions

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

据我所知,Rails的做事方式是:

  • 创建模型。
  • 使用诸如create,show等
  • 之类的操作为此模型创建控制器
  • 通过具有相应名称的相关视图呈现这些操作,例如new.html.erb,show.html.erb等。
  • 使用路由器将视图路由到所需的URL。

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

例如,在我们的应用程序中,我们有一个User模型,一个Calendar模型和一个Post模型。

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

我们需要让人们:

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

我们完成此任务的方式是:

  • 制作_calendar_form.html.erb表单并将其包含在我们的用户show.html.erb中。
  • 制作_post_form.html.erb表单并将其包含在我们的日历show.html.erb中。

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

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

2 个答案:

答案 0 :(得分:1)

将表单放在任何地方都是可以接受的,但通常一定要将表单提交到正确的终端。如果calendarpost采用不同的形式,您可能希望将其发布到CalendarsControllerPostsController

例外情况通常是模型中有accepts_nested_attributes_for。例如。如果class Calendaraccepts_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和关联的工作原理。对于其他模型,请遵循相同的方法。希望这可以帮助。