我已经开始使用新工具处理旧项目。这一次——Ruby 上的 Rails。我设法取得了一些进展,现在我想改进我的代码的一个元素。
整个项目是关于对所有跟踪的错误进行完整历史搜索的错误跟踪。现在我在用户输入错误的阶段。每个错误都属于属于项目的表。
唯一的问题 - 现在 - 是当我使用全新的名称时表名的自动完成(对于已经存在于数据库中的表,它工作得很好,在 Bug 条目中填充 table_id)。
负责输入(或从现有表中选择)表的部分视图如下所示:
<div class="control-group">
<%= f.label :table_name, :class => 'control-label' %>
<div class="controls">
<%= f.autocomplete_field :table_name, autocomplete_table_name_bugs_path %>
</div>
</div>
没有什么不寻常的。这个去模型(Bug.rb)
class Bug < ActiveRecord::Base
attr_accessible :bugid, :fixdate, :fixnote, :fixstate_id, :milestone, :newtarget, :notes, :oldtarget, :project_id, :bugreason, :reason_id, :regressiondate, :regressionstate_id, :source, :stringid, :table_id
belongs_to :project
belongs_to :table
belongs_to :reason
belongs_to :state
def table_name
table.name if table
end
#def table_name=(name)
# self.table = Table.find_or_create_by_name(name) unless name.blank?
#end
end
如您所见,目前没有验证。table_name=(name) 评论说它在我的代码中显然没有做任何事情。
这适用于错误控制器(bugs_controller.rb)
def create
if params[:bug][:table_id].nil?
if Table.find_or_create_by_name(params[:bug][:table_name])
params[:bug][:table_id] = Table.find_by_name(params[:bug][:table_name]).id
params[:bug].delete :table_name
end
end
@bug = Bug.new(params[:bug])
respond_to do |format|
if @bug.save
format.html { redirect_to bugs_path, notice: 'Bug was successfully created.' }
format.json { render json: @bug, status: :created, location: @bug }
else
format.html { render action: "new" }
format.json { render json: @bug.errors, status: :unprocessable_entity }
end
end
end
我在这里只放了负责保存新错误的部分,当我正确完成这部分时,我将设法处理更新部分。
我要改进的是第一部分。现在它不仅负责将 table_name 更改为 table_id,还负责创建新表(如果它不存在)。我知道这部分应该由模型处理,但我不知道该怎么做,可以使用一些帮助。
另一部分,顺便说一句。是我的下拉菜单,用户可以在其中选择活动项目。它由部分处理:
<% @projects.each do |project| %>
<% if project.id == session[:current_project].to_i %>
<li class="disabled"><%= link_to project.name, '#' %></li>
<% else %>
<li><%= link_to project.name, choose_project_path(project.id) %></li>
<% end %>
<% end %>
但它只有在项目控制器中使用时才能正常工作。如何 - 按照书本 - 我可以从其他控制器处理这个?确切地说,我希望它在整个项目中以相同的方式工作。
现在我在每个控制器中通过片段来处理它,但我很确定 RoR 之神对此并不满意。
before_filter :projects
def projects
@projects = Project.all
end
应该如何以适当的方式完成?:)