使用 lib 文件夹中的 Ruby 对象时出现未初始化常量错误
uninitialized constant error when using Ruby Object in lib folder
我有一个相当复杂的应用程序,它使用 lib 文件夹中的 Ruby 个对象(我第一次使用 ruby 个对象)。我不断收到这样一个未初始化的常量错误:
uninitialized constant ProjectsController::ProjectUpdater
我的表单试图做的是根据预制的 "template" 任务和里程碑创建启动任务和启动里程碑。因此,当用户创建项目时,他们已经添加了一些常见任务。此代码与之前的问题和答案直接相关:
我的控制器:
class ProjectsController < ApplicationController
def new_milestones
@project.milestones.build
@project.tasks.build
@milestones_templates = MilestoneTemplate.where(template_id: @project.template_id)
end
def update
respond_to do |format|
**result = ProjectUpdater.perform(@project, update_params) == true** <-- the error is on this line
if result == true
format.html { redirect_to @project, notice: 'Project was successfully updated.' }
format.json { render :show, status: :ok, location: @project }
else
@project = result
format.html { render :edit }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
def project_params
params.require(:project).permit(:id, :name, :template_id, milestone_attributes:[{:names => []}, {:ids => []}, { :milestone_ids => []},:id, :name, :project_id, :milestone_template_id, :project_id, task_attributes: [{:names => []}, {:ids => []}, { :task_ids => []}, :id, :name, :milestone_id, :task_template_id, :project_id, :_destroy]])
end
end
lib/project_updater.rb
class ProjectUpdater
def self.perform(project, params)
milestones = params[:project][:milestones]
#Create and save each milestone
# You might be able to us nested attributes to save tasks.
if project.update_attributes(params[:project])
return true
else
return project
end
end
end
我的表格
<%= form_for @project do |f| %>
<% @milestones_templates.each_with_index do |milestone, index| %>
<br>
<%= f.fields_for :milestones, index: index do |fm| %>
<%= fm.hidden_field :name, value: milestone.name %>
<!-- Create a checkbox to add the milestone_id to the project -->
<%= fm.label milestone.name %>
<%= fm.check_box :milestone_template_id,{}, milestone.id %>
<br>
<% milestone.task_templates.each_with_index do |task, another_index| %>
<%= fm.fields_for :tasks, index: another_index do |ft| %>
<!-- Create a checkbox for each task in the milestone -->
<%= ft.label task.name %>
<%= ft.check_box :task_ids, {}, task.id %>
<% end %>
<% end %>
<br>
<% end %>
<% end %>
<br>
<%= f.submit %>
<% end %>
我认为你需要在 /lib
目录中获取 ruby 文件,并确保你遵循命名约定.. 比如
# in lib/foo.rb:
class Foo
end
# in lib/foo/bar.rb:
class Foo::Bar
end
# in you case, in lib/project_updater.rb
class ProjectUpdater
def self.perform (your_params,,,)
# your code
end
end
在 config/application.rb:
config.autoload_paths << %W(#{config.root}/lib)
这可能对你有帮助,也许:)
我有一个相当复杂的应用程序,它使用 lib 文件夹中的 Ruby 个对象(我第一次使用 ruby 个对象)。我不断收到这样一个未初始化的常量错误:
uninitialized constant ProjectsController::ProjectUpdater
我的表单试图做的是根据预制的 "template" 任务和里程碑创建启动任务和启动里程碑。因此,当用户创建项目时,他们已经添加了一些常见任务。此代码与之前的问题和答案直接相关:
我的控制器:
class ProjectsController < ApplicationController
def new_milestones
@project.milestones.build
@project.tasks.build
@milestones_templates = MilestoneTemplate.where(template_id: @project.template_id)
end
def update
respond_to do |format|
**result = ProjectUpdater.perform(@project, update_params) == true** <-- the error is on this line
if result == true
format.html { redirect_to @project, notice: 'Project was successfully updated.' }
format.json { render :show, status: :ok, location: @project }
else
@project = result
format.html { render :edit }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
def project_params
params.require(:project).permit(:id, :name, :template_id, milestone_attributes:[{:names => []}, {:ids => []}, { :milestone_ids => []},:id, :name, :project_id, :milestone_template_id, :project_id, task_attributes: [{:names => []}, {:ids => []}, { :task_ids => []}, :id, :name, :milestone_id, :task_template_id, :project_id, :_destroy]])
end
end
lib/project_updater.rb
class ProjectUpdater
def self.perform(project, params)
milestones = params[:project][:milestones]
#Create and save each milestone
# You might be able to us nested attributes to save tasks.
if project.update_attributes(params[:project])
return true
else
return project
end
end
end
我的表格
<%= form_for @project do |f| %>
<% @milestones_templates.each_with_index do |milestone, index| %>
<br>
<%= f.fields_for :milestones, index: index do |fm| %>
<%= fm.hidden_field :name, value: milestone.name %>
<!-- Create a checkbox to add the milestone_id to the project -->
<%= fm.label milestone.name %>
<%= fm.check_box :milestone_template_id,{}, milestone.id %>
<br>
<% milestone.task_templates.each_with_index do |task, another_index| %>
<%= fm.fields_for :tasks, index: another_index do |ft| %>
<!-- Create a checkbox for each task in the milestone -->
<%= ft.label task.name %>
<%= ft.check_box :task_ids, {}, task.id %>
<% end %>
<% end %>
<br>
<% end %>
<% end %>
<br>
<%= f.submit %>
<% end %>
我认为你需要在 /lib
目录中获取 ruby 文件,并确保你遵循命名约定.. 比如
# in lib/foo.rb:
class Foo
end
# in lib/foo/bar.rb:
class Foo::Bar
end
# in you case, in lib/project_updater.rb
class ProjectUpdater
def self.perform (your_params,,,)
# your code
end
end
在 config/application.rb:
config.autoload_paths << %W(#{config.root}/lib)
这可能对你有帮助,也许:)