Ruby on rails MVC

300
10 февраля 2017, 05:39

Добрый день! Никак не могу реализовать добавление задачи с возможностью выбора раздела для этой задачи. Есть 2 модели:

Раздел для задачи:

class Project < ApplicationRecord
  has_many :todos
  validates :title, presence: true,
                    length: { minimum: 1 }
end

и сама задача с меткой о выполнении:

class Todo < ApplicationRecord
  belongs_to :project
end

есть контроллер:

class TodosController < ApplicationController
def create
    @project = Project.find(params[:project_id])
    @todo = @project.todos.create(todo_params)
    redirect_to project_path(@project)
end
private
def todo_params
    params.require(:todo).permit(:text)
end
end

Вот форма добавления задачи:

<%= form_for([@project, @project.todos.build]) do |f| %>
  <p>
    <%= f.label :'Текст задачи' %><br>
    <%= f.text_field :text %>
  </p>
  <p>
  <%= f.label :'Метка о выполнении' %><br>
    <%= check_box_tag(:isCompleted)%>
  </p> 
  <p>
    <%= f.submit %>
    <%= link_to 'submit', "", :onclick => "$('form').submit()" %>
  </p>
<% end %>

Пытаюсь сделать что-то типо этого:

      <h2>Добавить задачу:</h2>
<%= select_tag(:project, options_for_select([['Семья', 1], ['Работа', 2], ['Прочее', 3]])) %>
<%= render 'todos/form' %>

Но не знаю как связать и передать в render id моего раздела, что бы в него добавить нужную задачу

Вот скрин формы:

Подскажите пожалуйста как это реализовать, нужно сделать очень срочно

Вот мой routes:

Rails.application.routes.draw do
    resources :projects do
    resources :todos
    end
    root 'projects#index'
end
Answer 1
Ох, с чего бы начать...
  • Элемент ввода project_id должен быть внутри формы, поскольку иначе он просто не уйдёт на сервер в её параметрах.

    • Проще всего его select просто перенести внутрь формы (вот только это сходу не сработает, ниже расскажу почему).
    • ...но можно добавить в форму только hidden-поле, значение в которое записывать JS'ом на основе каких бы там ни было манипуляций с другими вещами на странице.
  • Вы почему-то решили держать project_id в корне параметров (params[:project_id]), а не в параметрах объекта, который создаёте (params[:todo][:project_id]).

    • ...видимо, потому что этот параметр вы держите в URL, он вшивается в значение атрибута action тега form и никакими input'ами напрямую меняться не может, поскольку с точки зрения HTML параметром не является.
      • От form_for([@project, @project.todos.build]) придётся избавляться, если вы хотите отдельный input для project_id. В пользу form_for @todo или чего бы там ни было ещё.
      • Скорее всего, для этого придётся и роуты изменить, сделав todos#create вне блока resources :projects. Вложенность ресурсов для вашего случая оказалась скорее вредна, чем полезна. Вы можете разделить маршруты на чтение и запись: чтение сделать красивым и вложенным, а запись практичной и плоской.
    • Если вы после выноса project_id в отдельный input решили оставить его на том же месте (и не менять код контроллера), то... Вы добрались до select_tag, вам не хватает метода options_from_collection_for_select, который может на основе коллекции моделей и двух методов (под обозначение и значение) подготовить набор <option>-элементов, примерно так:

      select_tag(:project_id,
                  options_from_collection_for_select(Project.all, :id, :title))
      
    • ...а можно разместить project_id на месте params[:todo][:project_id] (соответственно изменив todo_params и процедуру создания, убрав явный поиск @project), это позволило бы воспользоваться collection_select'ом построителя формы:

      f.collection_select(:project_id, Project.all, :id, :title)
      

      Это уже почти красиво.

  • :onclick => "$('form').submit()" это восхитительный способ прострелить себе ногу в момент, когда на странице станет больше одной формы. Да и кнопка сама по себе делает почти то же самое и без этого атрибута, только ещё форму для отправки при этом выбирает правильнее.

READ ALSO
Почему не включается locale(&#39;ru&#39;) в moment.js

Почему не включается locale('ru') в moment.js

Включил в проект ссылки на momentjs и русскую локализацию

354
Передача переменной из js в php

Передача переменной из js в php

Есть форма с отправкой данных в php и получение результата обратно

410
GET-запрос с параметрами не видемыми в URL

GET-запрос с параметрами не видемыми в URL

Имеется GET-запрос, но при загрузке страницы в URL не видно параметровКак так происходит? Что это такое и где почитать подробно?

266