0

我已经开始使用新工具处理旧项目。这一次——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

应该如何以适当的方式完成?:)

4

1 回答 1

0

所以我设法将逻辑从控制器转移到模型。此外,它还保存了我需要的所有数据 - table_id 到 bugs 表和 project_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>

模型现在看起来像这样:

class Bug < ActiveRecord::Base
  attr_accessible :table_name, :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, project_id: self.project_id ) unless name.blank?
  end

end

所以唯一的改变是取消注释 table_name= 方法并将 project_id 添加到新表的创建中(并且缺少 project_id 是它之前没有工作的原因)。

控制器如下所示:

  def create

    @bug = Bug.new(params[:bug])
    @bug.project_id = session[:current_project]

    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

它就像魅力一样工作。我仍然有问题,但会将其作为单独的问题发布。

于 2013-03-18T10:39:54.050 回答