0

Извините, если это глупый вопрос, я не опытный разработчик Rails.Rails: отображение формы от одной модели к другой модели.

Из того, что я понимаю, Rails способ делать вещи:

  • Создание модели.
  • Создайте контроллер для этой модели с такими действиями, как создание, показ и т. Д.
  • Проведите эти действия через связанный с ним вид с соответствующим именем, таким как new.html.erb, show.html.erb и т. Д. .
  • Проложите маршрут к нужному URL-адресу с маршрутизатором.

Что я не понимаю, так это то, можем ли мы смешивать две модели друг с другом.

Например, в нашем приложении у нас есть модель User, модель Calendar и модель Post.

Пользователь имеет много календарей и календарь имеет много сообщений.

И мы должны позволить людям:

  • Создать новую @calendar из своего профиля (пользователей # шоу).
  • Создайте новый @post из календаря.

Путь мы сделали это с помощью:

  • Создание _calendar_form.html.erb формы и включить его в наших пользователей show.html.erb.
  • Создание формы _post_form.html.erb и включение ее в наш календарь show.html.erb.

Однако мы не уверены, что это правильный/Rails способ делать вещи и чувствовать, что мы можем сломать шаблон MVC.

Если это так, есть ли решение для достижения аналогичного результата, но с более традиционным подходом?

ответ

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 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

Это приемлемо, если вы хотите разместить форму в любом месте, но обычно обязательно отправляйте форму в нужную конечную точку. Если calendar и post - в различных формах, вы бы ожидали, что они будут отправлены в CalendarsController и PostsController.

Исключением из этого обычно является то, что у вас есть accepts_nested_attributes_for в вашей модели. Например. если class Calendar имел accepts_nested_attributes_for :posts, вы могли бы иметь CalendarsController do Calendar.new(posts: {description: 'Foo'}), и календарь и почта будут сохранены сразу.

Это помогает мне сначала подумать о действиях REST (подумайте, что ваша форма календаря составляет /calendars и т. Д.), А контроллеры просто являются прокси-сервером для того, что вы могли бы сделать в командной строке с моделями (создавать записи моделей , и т.д.). Этот подход также заставляет вас думать о «толстой модели/тонком контроллере» и абстрактно, насколько это возможно в вашей модели.

+0

Спасибо за ваше объяснение. –

Смежные вопросы