Rails 5.0.5 - 不使用 Ancestry 保存数据 Gem
Rails 5.0.5 - Data not saving using Ancestry Gem
我正在使用 Ancestry Gem 为我的 Page 模型构建树。页面保存但字段数据未保存到数据库中。我没有看到任何错误,因为我是 Rails 的新手,所以我不确定如何调试。下面是我的代码。谢谢。
页面模型
class Page < ApplicationRecord
attr_accessor :parent_id, :content, :title
has_ancestry
end
页面控制器 - def create
def create
@page = Page.new(page_params)
respond_to do |format|
if @page.save
format.html { redirect_to @page, notice: 'Page was successfully created.' }
format.json { render :show, status: :created, location: @page }
else
format.html { render :new }
format.json { render json: @page.errors, status: :unprocessable_entity }
end
end
end
_form.html.erb
...
<div class="field">
<%= f.label :parent_id %>
<%= f.collection_select :parent_id, Page.order(:title), :id, :title, include_blank: true %>
</div>
...
因为你使用 rails 5.0.5 那么你必须使用强参数来允许字段被保存而不是 attr_accessor :parent_id, :content, :title
你应该删除 attr_accessor 并在下面添加我的示例代码(你可以添加其他字段但确保你添加了 parent_id for ancestry gem)
有关强参数的更多信息,您可以查看 strong parameter rails
page_controller
class PagesController < ApplicationController
# your create method here
private
def page_params
params.require(:page).permit(
:title,
:your_other_field,
:parent_id)
end
end
已针对血统字段进行编辑
根据您的信息,您已经添加了脚手架 parent_id 字段,请尝试检查它并在下面为您添加 parent_id
的参考步骤
- rails 生成迁移 add_ancestry_to_pages ancestry:string
- 打开您的迁移文件并检查字段如下
文件夹内的迁移文件db/migrate
class AddAncestryTopages < ActiveRecord::Migration
def change
add_column :pages, :ancestry, :string
add_index :pages, :ancestry
end
end
- 运行 耙子 db:migrate
为您的观点编辑
而不是使用 collection select 请使用 select,您可以检查它 this link 因为 collection_select 输出是一个数组并且与 parent_id 对于刚刚收到一个 parent
的祖先
<%= f.select :parent_id, Page.order(:title).collect {|p| [ p.title, p.id ] }, { include_blank: true } %>
编辑访问 parent
如果您想从 child 祖先记录中访问 parent,您可以使用 object.parent.column_name 访问它,考虑您的 column_name 是名称,那么您可以使用 <%= page.parent.name %> 访问 parent 页面的标题,以获取有关 navigate your record here is link that you need 的更多信息
我正在使用 Ancestry Gem 为我的 Page 模型构建树。页面保存但字段数据未保存到数据库中。我没有看到任何错误,因为我是 Rails 的新手,所以我不确定如何调试。下面是我的代码。谢谢。
页面模型
class Page < ApplicationRecord
attr_accessor :parent_id, :content, :title
has_ancestry
end
页面控制器 - def create
def create
@page = Page.new(page_params)
respond_to do |format|
if @page.save
format.html { redirect_to @page, notice: 'Page was successfully created.' }
format.json { render :show, status: :created, location: @page }
else
format.html { render :new }
format.json { render json: @page.errors, status: :unprocessable_entity }
end
end
end
_form.html.erb
...
<div class="field">
<%= f.label :parent_id %>
<%= f.collection_select :parent_id, Page.order(:title), :id, :title, include_blank: true %>
</div>
...
因为你使用 rails 5.0.5 那么你必须使用强参数来允许字段被保存而不是 attr_accessor :parent_id, :content, :title 你应该删除 attr_accessor 并在下面添加我的示例代码(你可以添加其他字段但确保你添加了 parent_id for ancestry gem) 有关强参数的更多信息,您可以查看 strong parameter rails
page_controller
class PagesController < ApplicationController
# your create method here
private
def page_params
params.require(:page).permit(
:title,
:your_other_field,
:parent_id)
end
end
已针对血统字段进行编辑
根据您的信息,您已经添加了脚手架 parent_id 字段,请尝试检查它并在下面为您添加 parent_id
的参考步骤- rails 生成迁移 add_ancestry_to_pages ancestry:string
- 打开您的迁移文件并检查字段如下
文件夹内的迁移文件db/migrate
class AddAncestryTopages < ActiveRecord::Migration
def change
add_column :pages, :ancestry, :string
add_index :pages, :ancestry
end
end
- 运行 耙子 db:migrate
为您的观点编辑
而不是使用 collection select 请使用 select,您可以检查它 this link 因为 collection_select 输出是一个数组并且与 parent_id 对于刚刚收到一个 parent
的祖先<%= f.select :parent_id, Page.order(:title).collect {|p| [ p.title, p.id ] }, { include_blank: true } %>
编辑访问 parent
如果您想从 child 祖先记录中访问 parent,您可以使用 object.parent.column_name 访问它,考虑您的 column_name 是名称,那么您可以使用 <%= page.parent.name %> 访问 parent 页面的标题,以获取有关 navigate your record here is link that you need 的更多信息