私は新しいツールを使って古いプロジェクトに取り組み始めました。今回は-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
それは適切な方法でどのように行われるべきですか?:)