0

現在の私のコードは問題なく動作しますが、もっとうまくやれる可能性があると言えます。それで、私はいくつかの入力を求めると思いました。

特定の経費について、ユーザーは提出または提出を取り消すことができます。これにより、expense_approvals テーブルにレコードが作成され、approval_status が 1 または 0 に設定されます。

複雑なのは、誰かが経費の提出を取り消し、後で再提出した場合です。レコードが既に存在するため、それを処理するロジックを入れなければなりませんでした。

私の直感は、これをもっときれいにするためにモデルやコントローラーでできることがあると教えてくれます。

したがって、私のモデルは次のようになります。

class Expense < ActiveRecord::Base
  attr_accessible :amount, :expense_date, :description

  has_one :expense_approval
end

class ExpenseApproval < ActiveRecord::Base
  attr_accessible :approval_date, :approval_status, :approver_id, :expense_id

  belongs_to :expense, foreign_key: :expense_id

  validates_uniqueness_of :expense_id
end

そしてコントローラー

def submit_expense
  @expense_list = Expense.all  
  expense = Expense.find(params[:id])

  if expense.expense_approval
    approval = ExpenseApproval.find(expense.expense_approval.id)
    approval.approval_status = 1
  else
    approval = ExpenseApproval.new(approval_status: "1", expense_id: expense.id)
  end

  if approval.save
    #flash[:success] = "You have added an submission."
    redirect_to expense_approvals_path
  else
    flash[:error] = "Error"    
    redirect_to expense_approvals_path
  end
end

def un_submit_expense
  @expense_list = Expense.all  
  @expense = ExpenseApproval.find(params[:id])
  @expense.approval_status = 0

  if @expense.save
    #flash[:success] = "You have un submitted."
    redirect_to expense_approvals_path
  else
    flash[:error] = "Unsubmit Error"    
    redirect_to expense_approvals_path
  end
end

と表示

 <% if expense_item.expense_approval %>
              <%#=expense_item.expense_approval.approval_status%>

              <% if expense_item.expense_approval.approval_status == 1 %>
                        <%= link_to raw('<i class="icon-arrow-down icon-white"> </i>'), 
                              un_submit_expense_path(expense_item.expense_approval[:id]),
                              class: "btn btn-mini btn-warning", 
                              :confirm => "Are you sure you want to un submit this expense?" %>
              <% end %>

              <% if expense_item.expense_approval.approval_status == 0 %>
                        <%= link_to raw('<i class="icon-arrow-up icon-white"> </i>'), 
                              submit_expense_path(expense_item[:id]),
                              class: "btn btn-mini btn-info", 
                              :confirm => "Are you sure you want to submit this expense?" %>
              <% end %>

            <% else %>

             <%= link_to raw('<i class="icon-arrow-up icon-white"> </i>'), 
                              submit_expense_path(expense_item[:id]),
                              class: "btn btn-mini btn-info", 
                              :confirm => "Are you sure you want to submit this expense?" %>

            <% end %>
4

1 に答える 1

1

デコレータを使用してビューをクリーンアップできます。

さらに、次のようなコードの重複があります。

if @expense.save
  flash[:success] = "You have un submitted."
  redirect_to expense_approvals_path
else
  flash[:error] = "Unsubmit Error"    
  redirect_to expense_approvals_path
end

以下とほとんど同じです:

if @expense.save
  flash[:success] = "You have un submitted."
else
  flash[:error] = "Unsubmit Error"    
end
redirect_to expense_approvals_path
于 2012-10-29T18:45:26.523 に答える