Добрый день! Никак не могу реализовать добавление задачи с возможностью выбора раздела для этой задачи. Есть 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()"
это восхитительный способ прострелить себе ногу в момент, когда на странице станет больше одной формы. Да и кнопка сама по себе делает почти то же самое и без этого атрибута, только ещё форму для отправки при этом выбирает правильнее.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Включил в проект ссылки на momentjs и русскую локализацию
Есть форма с отправкой данных в php и получение результата обратно
Имеется GET-запрос, но при загрузке страницы в URL не видно параметровКак так происходит? Что это такое и где почитать подробно?
Например userage - от 18 лет