具有两个模型的 rails 应用程序中的参数数量错误(0 代表 1)
wrong number of arguments (0 for 1) in a rails app with two models
我不断收到 'a wrong number of arguments (0 for 1)' 错误,这似乎是一个广泛的错误,我似乎无法缩小它的原因。
我正在制作一个约会应用程序,它在名为 Project 的 table 中记录日期范围(start_date、end_date)。创建新项目时,将为 start_date 和 end_date 范围内的每个日期生成一个 ProjectDate 记录(即 Feb.1 -Feb.7 创建 7 个 ProjectDate 记录)。
出现错误的行是:“if @project.update_attributes”
我是 rails 的新手,所以我真的不明白为什么它不传递参数。我的理论是,也许我的 form_for url 路径有误...但我不知道怎么办。
项目控制器(出现错误的地方)
def edit_date_range
@project = Project.find(params[:p])
end
def update_date_range
@project = Project.find(params[:p])
if @project.update_attributes
redirect_to k1s3_path(:p => @project.id)
else
redirect_to edit_date_range_path(:p => @project.id)
end
end
型号
class Project < ActiveRecord::Base
has_many :project_dates, dependent: :destroy, inverse_of: :project
accepts_nested_attributes_for :project_dates, allow_destroy: true
after_update :add_and_remove_dates
def dates_in_date_range
(self.prep_start.to_date .. self.prep_end.to_date.to_a)
end
def add_and_remove_dates
dates.where('schedule_date < ? OR schedule_date > ?', start_date, end_date).destroy_all
dates_in_date_range.each do |date|
dates.find_or_create_by(schedule_date: date, available: true)
end
end
class ProjectDates < ActiveRecord::Base
belongs_to :project, inverse_of: :project_dates
Table 结构
Project table structure
:id
:title (string)
:start_date (date)
:end_date(date)
:status (boolean)
ProjectDates table structure
:id
:project_id (integer)
:schedule_date (date)
:available (boolean)
形式
<%= form_for @project, url: update_date_range_path(:p => @project.id) do |f| %>
<%= f.hidden_field :org_start, :value => @project.start_date %>
<%= f.hidden_field :org_end, :value => @project.end_date %>
<%= f.text_field :end_date %>
<%= f.text_field :start_date%>
<%= f.submit 'SAVE CHANGES' %>
<% end %>
您没有将任何参数传递给 update_attributes
方法,该方法需要 1 个参数(通常是包含需要更新的所有内容的散列)。因此 wrong number of arguments (0 for 1)
错误消息。
变化:
if @project.update_attributes
到
if @project.update_attributes(project_params)
project_params
将是根据需要设置所需参数的私有方法
private
def project_params
params.require(:project).permit(<attr1>, <attr2>, <attr3>...)
end
我不断收到 'a wrong number of arguments (0 for 1)' 错误,这似乎是一个广泛的错误,我似乎无法缩小它的原因。
我正在制作一个约会应用程序,它在名为 Project 的 table 中记录日期范围(start_date、end_date)。创建新项目时,将为 start_date 和 end_date 范围内的每个日期生成一个 ProjectDate 记录(即 Feb.1 -Feb.7 创建 7 个 ProjectDate 记录)。
出现错误的行是:“if @project.update_attributes”
我是 rails 的新手,所以我真的不明白为什么它不传递参数。我的理论是,也许我的 form_for url 路径有误...但我不知道怎么办。
项目控制器(出现错误的地方)
def edit_date_range
@project = Project.find(params[:p])
end
def update_date_range
@project = Project.find(params[:p])
if @project.update_attributes
redirect_to k1s3_path(:p => @project.id)
else
redirect_to edit_date_range_path(:p => @project.id)
end
end
型号
class Project < ActiveRecord::Base
has_many :project_dates, dependent: :destroy, inverse_of: :project
accepts_nested_attributes_for :project_dates, allow_destroy: true
after_update :add_and_remove_dates
def dates_in_date_range
(self.prep_start.to_date .. self.prep_end.to_date.to_a)
end
def add_and_remove_dates
dates.where('schedule_date < ? OR schedule_date > ?', start_date, end_date).destroy_all
dates_in_date_range.each do |date|
dates.find_or_create_by(schedule_date: date, available: true)
end
end
class ProjectDates < ActiveRecord::Base
belongs_to :project, inverse_of: :project_dates
Table 结构
Project table structure
:id
:title (string)
:start_date (date)
:end_date(date)
:status (boolean)
ProjectDates table structure
:id
:project_id (integer)
:schedule_date (date)
:available (boolean)
形式
<%= form_for @project, url: update_date_range_path(:p => @project.id) do |f| %>
<%= f.hidden_field :org_start, :value => @project.start_date %>
<%= f.hidden_field :org_end, :value => @project.end_date %>
<%= f.text_field :end_date %>
<%= f.text_field :start_date%>
<%= f.submit 'SAVE CHANGES' %>
<% end %>
您没有将任何参数传递给 update_attributes
方法,该方法需要 1 个参数(通常是包含需要更新的所有内容的散列)。因此 wrong number of arguments (0 for 1)
错误消息。
变化:
if @project.update_attributes
到
if @project.update_attributes(project_params)
project_params
将是根据需要设置所需参数的私有方法
private
def project_params
params.require(:project).permit(<attr1>, <attr2>, <attr3>...)
end