Добрый день! Никак не могу реализовать добавление задачи с возможностью выбора раздела для этой задачи. Есть 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
Элемент ввода project_id должен быть внутри формы, поскольку иначе он просто не уйдёт на сервер в её параметрах.
select просто перенести внутрь формы (вот только это сходу не сработает, ниже расскажу почему).hidden-поле, значение в которое записывать JS'ом на основе каких бы там ни было манипуляций с другими вещами на странице.Вы почему-то решили держать project_id в корне параметров (params[:project_id]), а не в параметрах объекта, который создаёте (params[:todo][:project_id]).
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()" это восхитительный способ прострелить себе ногу в момент, когда на странице станет больше одной формы. Да и кнопка сама по себе делает почти то же самое и без этого атрибута, только ещё форму для отправки при этом выбирает правильнее.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей