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

感謝您的解釋。 –

相關問題