我对rails非常陌生,并试图自己为ToDo列表创建一个应用程序。
如何传递参数"类别名称"和"任务描述"以下表格。
用户/显示/ html.erb
<aside class="col-md-8">
<section>
<%= render 'tasks/new' %><br>
</section>
<section>
<% if @user.tasks.any? %>
<ol class="tasks">
<%= render @tasks %>
</ol>
<% end %>
</section>
</aside>
任务/ new.html.erb
<div class="form-inline">
<%= form_for([@user, @user.tasks.build]) do |f| %>
<select id="selectUser" class="form-control selectWidth">
<option class="">Select Category</option>
<% @user.categories.all.each do |category| %>
<option class="">
<%= category.name %>
</option>
<% end %>
</select>
<%= f.label :description %>
<%= f.text_area :description, class: 'form-control' %>
<%= f.submit %>
<% end %>
</div>
控制器/ tasks_controller
class TasksController < ApplicationController
def create
@user = User.find(params[:id])
@category = Category.find_by(name: params[:category])
@task = @user.tasks.create(task_params)
redirect_to user_path(@user)
end
private
def task_params
params.require(:task).permit(@category.name, :description)
end
end
任务表中的列是
类别表中的列是:
我尝试从新任务表单传递的参数是来自name
表格的category
和来自description
表格的tasks
答案 0 :(得分:0)
我想你想要分类任务而不是用户。所以首先你应该在类别表中删除user_id
。
应该有3个表将类别连接到任务。任务,类别和任务类别将这些表与has_many:通过关系连接到两个方面,如http://guides.rubyonrails.org/association_basics.html在2.8(您选择has_many到版本)。
然后在控制台或表单中手动创建类别。我想你想确定类别,用户可以从中选择,所以我推荐console或seeds.rb。以下是类别创建的示例:
Category.create!([{name: "IoT"}, {name: "AI"}, {name: "FinTech"}, {name: "Automotive"}, {name: "Health & Welness"}, {name: "IT & Data Science"}, {name: "FinTech"}, {name: "Education"}, {name: "Retail"}])
一旦这些设置在数据库中并且设置了表之间的连接(数据库中的外键和模型中的关联),您可以在任务表单中使用它:
<div class="form-group">
<%= f.collection_select :category_ids, Category.all.order(name: :asc), :id, :name, {}, { multiple: true } %> #with multiple you can choose more at once
</div>
不要忘记任务模型中强大的参数:
....category_ids: []... #with plural you can choose more at once
回答你的上一句话:你在集合中显示名称,但你传递的category_id
cuz TaskCategories
表没有category.name
,因为它在类别表中。 task.description
很容易,因为这是一个任务表单,所以你不应该有任何问题,只是不要忘记在任务强对手中使用:description
。
P.S。您可以使用简洁的form_for @task
并将其放入您的控制器:
def new
@task = Task.new
end
def create
@task = current_user.tasks.new(task_params)
end