Rails todo list隐藏创建列

时间:2017-05-11 08:46:52

标签: ruby-on-rails ruby

我使用todo_list表单添加标题和说明,然后将内容添加到todo_item表单。但我想在我创建todo_item的每一行的标题字段中注册todo_list标题字段。如何在控制器端提供此功能?

class TodoItemsController < ApplicationController
  before_action :set_todo_list
  before_action :set_todo_item, except: [:create]

  def create
      @todo_item = @todo_list.todo_items.create(todo_item_params)

      redirect_to @todo_list
  end  

end

todo_item模型

class TodoItem < ActiveRecord::Base
 belongs_to :todo_list

 def completed?
  !completed_at.blank?
 end
end

todo_list模型

class TodoList < ActiveRecord::Base
   has_many :todo_items
end

todo_item db

class CreateTodoItems < ActiveRecord::Migration
  def change
   create_table :todo_items do |t|
     t.string :title
     t.string :content
     t.references :todo_list, index: true

     t.timestamps
   end
  end
end

todo list db

class CreateTodoLists < ActiveRecord::Migration
  def change
    create_table :todo_lists do |t|
      t.string :title
      t.text :description

      t.timestamps
    end
  end
end

todo list _form.html.erb

<%= form_for(@todo_list) do |f| %>
   <% if @todo_list.errors.any? %>
     <div id="error_explanation">
       <h2><%= pluralize(@todo_list.errors.count, "error") %> prohibited 
 this todo_list from being saved:</h2>

       <ul>
       <% @todo_list.errors.full_messages.each do |message| %>
         <li><%= message %></li>
       <% end %>
       </ul>
     </div>
   <% end %>

   <div class="field">
     <%= f.label :title %><br>
     <%= f.text_field :title %>
   </div>
   <div class="field">
     <%= f.label :description %><br>
     <%= f.text_area :description %>
   </div>
   <div class="actions">
     <%= f.submit %>
   </div>
  <% end %>

todo item _form.html.erb

<%= form_for([@todo_list, @todo_list.todo_items.build]) do |f| %>
    <%= f.text_field :content, placeholder: "New Todo" %>
    <%= f.submit %>
<% end %>

todo item _todo_item_html.erb

<div class="row clearfix">
     <% if todo_item.completed? %>
         <div class="complete">
             <%= link_to complete_todo_list_todo_item_path(@todo_list, 
 todo_item.id), method: :patch do %>
                 <i style="opacity: 0.4;" class="fa fa-check"></i>
             <% end %>
         </div>
         div class="todo_item">
             <p style="opacity: 0.4;"><strike><%= todo_item.content %>
 </strike></p>
         </div>
         <div class="trash">
             <%= link_to todo_list_todo_item_path(@todo_list, todo_item.id), 
 method: :delete, data: { confirm: "Are you sure?" } do %>
            <i class="fa fa-trash"></i>
             <% end %>
         </div>
     <% else %>
         <div class="complete">
             <%= link_to complete_todo_list_todo_item_path(@todo_list, 
 todo_item.id), method: :patch do %>
                 <i class="fa fa-check"></i>
             <% end %>
         </div>
         <div class="todo_item">
             <p><%= todo_item.content %></p>
         </div>
         <div class="trash">
             <%= link_to todo_list_todo_item_path(@todo_list, todo_item.id), 
 method: :delete, data: { confirm: "Are you sure?" } do %>
                 <i class="fa fa-trash"></i>
             <% end %>
         </div>
     <% end %>
 </div>

1 个答案:

答案 0 :(得分:1)

这是你想要做的,我猜, 在ToDoItem模型中添加此内容..

before_create :set_title

def set_title
  self.title = todo_list.title
end

希望有所帮助......

根据评论中的要求进行更新。

更新父级时更新子项。

TodoList模型中,

before_save :update_todo_item_titles

def update_todo_item_titles
  todo_items.update_all(title: title) if title_changed?
end