Ruby on Rails的:如何使表单关联模型(嵌套的)所有的

问题描述:

首先,我有这样的:Ruby on Rails的:如何使表单关联模型(嵌套的)所有的

https://polar-scrubland-30279.herokuapp.com/ - 我的项目,该项目被部署在Heroku(队长明显)

我有项目和待办事项。 为了这一刻我展示使用这种方式,所有项目:

------index.html.erb------ 

<%= render @projects %> 

------_project.html.erb----- 

<div class="project"> 
    <div class="project-header"> 
    <h2><%= project.title %></h2> 
    </div> 
    <div class="project-todos"> 
    <% project.todos.all.each do |todo| %> 
     <p><%= check_box('tag', todo.__id__, {class: 'icheckbox_square-blue', checked: todo.isCompleted}) %> <%= content_tag :todotext, todo.text %></p> 
    <% end %> 
    </div> 
</div> 

而当你了解它不会让我改变我的待办事项的状态时复选框被选中。所以这就是为什么我需要一个可以让我跟踪所有复选框的表单。当我按下复选框时,我想让text-decoration: line-through,但不知道如何。

有没有办法创建一个能满足我需求的表单?请你能帮助我,任何信息将不胜感激。

附加INFORAMTION:

GitHub的 - https://github.com/NanoBreaker/taskmanager

project.rb

class Project < ActiveRecord::Base 
    has_many :todos 
end 

todo.rb

class Todo < ActiveRecord::Base 
    belongs_to :project 
end 
+0

你正在钻研javascript(客户端)的领域,幸运的是,你不需要为其中的很多东西留下ruby!无论何时,当你在提交表单等之前都想根据用户的行为来运行代码时,你会想使用javascript(更重要的是Jquery)。 – bkunzi01

让我们开始与型号:

class Project < ApplicationRecord 
    has_many :todos 
    accepts_nested_attributes_for :todos 
end 

class Todo < ApplicationRecord 
    belongs_to :project 
end 

accepts_nested_attributes_for允许您在创建或更新项目时一次创建或修改多个嵌套的Todo记录。

# will update 2 todos at once 
@project.update(
todos_attributes: [ { id: 1, isComplete: true }, { id: 2, isComplete: false }] 
) 

我们可以使用fields_for为待办事项创建嵌套输入:

<%= f.form_for(@project) do |f| %> 
    <%= f.fields_for(:todos) do |tf| %> 
    <%= tf.check_box :isCompleted %> 
    <% end %> 
<% end %> 

这产生了下方的按键todos_attributes嵌套的待办事项领域。我们可以使用包含许可属性数组的散列键将它们列入白名单。

# app/views/projects/_form.html.erb 
<%= f.form_for(local_assigns[:project] || @project) do |f| %> 
    <%= f.fields_for(:todos) do |tf| %> 
    <%= tf.check_box :isCompleted %> 
    <% end %> 
<% end %> 

# app/views/projects/index.html.erb 
<% @projects.each do |project| %> 
    <%= render partial: 'projects/form', project: project %> 
<% end %> 

可以重复使用相同的部分的其他视图,以及::

class ProjectsController < ApplicationController 
    before_action :set_project, only: [:show, :edit, :update, :destroy] 

    def new 
    @project = Project.new 
    # this seeds the project with 3 empty tasks 
    # otherwise we don't have any inputs. 
    3.times { @project.todos.new } 
    end 

    def create 
    @project = Project.new(project_params) 
    if @project.save 
     # ... 
    else 
     # ... 
    end 
    end 

    def update 
    if @project.update(project_params) 
     # ... 
    else 
     # ... 
    end 
    end 

    private 

    def set_project 
    @project = Project.find(params[:id]) 
    end 

    def project_params 
    params.require(:project) 
     .permit(:foo, :bar, 
     todos_attributes: [:isCompleted, :text] 
    ) 
    end 
end 

可以通过创建a partial其使用的local代替一个实例变量为每个项目创建一个形式

# app/views/projects/new.html.erb 
<%= render partial: 'projects/form' %> 

# app/views/projects/edit.html.erb 
<%= render partial: 'projects/form' %> 
+0

您的应用还有其他一些问题。总是使用'snake_case'命名方法和列。您在'todos.projects_id'上缺少外键约束。在为belongs_to关联创建列时使用'belongs_to'宏。您可以通过使用'add_foreign_key:todos,:projects'创建迁移来修复它。 – max

+0

让你兄弟!感谢您的回答,我们现在可以立即完成所有工作。 – NanoBreaker

+0

根据我的理解,你的表单中有一些拼写错误,应该有'tf'instead't'和类似'check_box_field'的方法,所以我使用了'check_box'。但是这仅仅是一个已经定义的@project的形式,但是我怎样才能用于@projects?还有一个关于迁移的问题,我可以在项目迁移文件中添加字符串“add_foreign_key:todos,:projects”吗? – NanoBreaker