0

私は新しいツールを使って古いプロジェクトに取り組み始めました。今回は-RailsonRuby。なんとか進歩を遂げましたが、今度はコードの1つの要素を改善したいと思います。

プロジェクト全体は、追跡されたすべてのバグの完全な履歴検索によるバグ追跡に関するものです。今、私はユーザーがバグを入力しているステージにいます。すべてのバグは、プロジェクトに属するテーブルに属します。

唯一の問題は、完全に新しい名前を使用している場合のテーブル名のオートコンプリートです(データベースにすでに存在するテーブルでは、正常に機能し、バグエントリの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をバグテーブルに、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 に答える