当涉及多个模型

时间:2016-02-27 01:31:40

标签: ruby-on-rails

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

任务表中的列是

  1. ID
  2. 描述
  3. user_id(使用用户表引用)
  4. category_id(带类别表的参考)
  5. 类别表中的列是:

    1. ID
    2. 名称
    3. user_id(对用户表的引用)
    4. 我尝试从新任务表单传递的参数是来自name表格的category和来自description表格的tasks

1 个答案:

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