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
让我们开始与型号:
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' %>
您的应用还有其他一些问题。总是使用'snake_case'命名方法和列。您在'todos.projects_id'上缺少外键约束。在为belongs_to关联创建列时使用'belongs_to'宏。您可以通过使用'add_foreign_key:todos,:projects'创建迁移来修复它。 – max
让你兄弟!感谢您的回答,我们现在可以立即完成所有工作。 – NanoBreaker
根据我的理解,你的表单中有一些拼写错误,应该有'tf'instead't'和类似'check_box_field'的方法,所以我使用了'check_box'。但是这仅仅是一个已经定义的@project的形式,但是我怎样才能用于@projects?还有一个关于迁移的问题,我可以在项目迁移文件中添加字符串“add_foreign_key:todos,:projects”吗? – NanoBreaker
你正在钻研javascript(客户端)的领域,幸运的是,你不需要为其中的很多东西留下ruby!无论何时,当你在提交表单等之前都想根据用户的行为来运行代码时,你会想使用javascript(更重要的是Jquery)。 – bkunzi01