为具有关联的对象创建表单

时间:2017-04-04 18:09:47

标签: ruby-on-rails ruby forms ruby-on-rails-3 models

我有两个模型:project和todo。项目有许多待办事项。

所以我想创建一个表单,从组合框中选择项目类别,然后我添加一个待办事项。

例如: 我有以下类别:家庭,工作,学习。

在组合框中的形式中,我选择“研究”,然后在文本字段中拼出一个类似“做星期一的作业”的待办事项'然后按提交按钮。

project.rb

class Project < ActiveRecord::Base
  has_many :todos
end

todo.rb

class Todo < ActiveRecord::Base

  belongs_to :project

end

我的数据架构:

  create_table "projects", force: :cascade do |t|
    t.string   "title"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "todos", force: :cascade do |t|
    t.string   "text"
    t.boolean  "isCompleted"
    t.integer  "project_id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

_form.html.erb

<%= form_for @project do |f| %>

  <div class="form_control">
    <%= f.select :title, options_for_select([["Work", "w"],
                                            ["Family", "f"],
                                           ["Study", "f"],
                                           ["TheRest", "t"]]) %>
  </div>

  <div class="form_control">
    *** HERE I NEED TO FIGURE OUT HOW TO ADD SOME DATA TO todo.text ***
  </div>  

  <div class="form_control">
    <%= f.submit 'Add' %>
  </div>
<% end %>

这就是我用他们的待办事项展示所有项目的方式:

<% @projects.each do |project| %>
    <h2> <%= project.title %> </h2>
    <% project.todos.all.each do |todo| %>
      <p><%= todo.text %> <%= check_box('tag', todo.__id__, {checked: todo.isCompleted}) %></p>
    <% end %>
<% end %>

GitHub链接:https://github.com/NanoBreaker/taskmanager

1 个答案:

答案 0 :(得分:1)

在你的待办事项表格中,你可以有一个选择框来选择待办事项所属的项目:

# todos/_todo_form.html.erb
  <%= select_tag "project_id", options_for_select(Project.pluck(:title, :id)) %>

在你的todos_controller create动作中:

def create
  @project = Project.find(params[:project_id])
  @todo = @project.todos.new(todo_params)
  if @todo.save
    # success
  else 
    # error 
  end
end 

最后,允许project_id中的todo_params

def todo_params
  params.require(:todo).permit(:text, :project_id) # add any other attributes you want
end