0

いくつかのレコードを Dropbox にアップロードするために使用している次のヘルパー メソッドがあります。3 つのモデル (ログブック、航空機、アプローチ) のそれぞれについて、まったく同じことを行っています。これをもっと DRY にしてコードを 1 回だけにしたいのですが、抽象化された方法でモデルを参照する方法がわかりません。

推奨事項はありますか?

#------------------------------------------------------------
# Upload entries to Dropbox
#------------------------------------------------------------
def upload_items(items, folder, client)

  # Go through each item and upload it to Dropbox
  items.each do |item|

    if folder == 'logbook'
      # Get the file from the database to upload
      @logbook = current_user.logbooks.find_by_sync_id(item)
      # Upload it
      uploaded_file = client.put_file("/logbook/#{item}.json",@logbook.to_json, overwrite = true)
      # Reset the updated_flag in the database
      @logbook.update_attributes(updated_flag: 0)

    elsif folder == 'aircraft'
      # Get the file from the database to upload
      @aircraft = current_user.aircrafts.find_by_sync_id(item)
      # Upload it
      uploaded_file = client.put_file("/aircraft/#{item}.json",@aircraft.to_json, overwrite = true)
      # Reset the updated_flag in the database
      @aircraft.update_attributes(updated_flag: 0)

    elsif folder == 'approaches'
      # Get the file from the database to upload
      @approach = current_user.approaches.find_by_sync_id(item)
      # Upload it
      uploaded_file = client.put_file("/approaches/#{item}.json",@approach.to_json, overwrite = true)
      # Reset the updated_flag in the database
      @approach.update_attributes(updated_flag: 0)

    end
  end
end

ルビー 1.9.3、レール 3.2.8

4

3 に答える 3

1

これは仕事をします。

以下の重要な部分current_user.public_send(folder.to_sym)は、フォルダー名を受け取り、それをメッセージに変換して current_user に送信することです。

#------------------------------------------------------------
# Upload entries to Dropbox
#------------------------------------------------------------
def upload_items(items, folder, client)

  # Go through each item and upload it to Dropbox
  items.each do |item|
    # Get the file from the database to upload
    resource = current_user.public_send(folder.pluralize.to_sym).find_by_sync_id(item)
    # Upload it
    uploaded_file = client.put_file("/#{folder}/#{item}.json",resource.to_json, overwrite = true)
    # Reset the updated_flag in the database
    resource.update_attributes(updated_flag: 0)
  end
end
于 2013-01-09T17:32:31.737 に答える
1

私はこれをそのように書きます:

class DropboxUploader
  attr_reader :folder, :client

  def initializer(folder, client)
    @folder = folder.to_sym
    @client = client
  end

  def upload(items)
    items.each { |item| update item }
  end

  def resource_name
    folder.to_s.pluralize.to_sym
  end

  def file_path
    "/#{folder}/#{item}.json"
  end

  private
  def find_resource_for(item)
    current_user.public_send(resource_name).find_by_sync_id(item)
  end

  def update(item)
    resource = find_resource_for item
    client.put_file(file_path, @aircraft.to_json, true)
    resource.update_attributes(updated_flag: 0)
  end
end

DRYだけでなく、より客観的でもあります(そしてテストが簡単です)。

編集: 使用法は次のようになります。

uploader = DropboxUploader.new(:aircraft, @client)
uploader.upload(@items)
于 2013-01-09T17:38:07.327 に答える
0

これは方向である必要があります:

あなたのコントローラー:

#------------------------------------------------------------
# Upload entries to Dropbox
#------------------------------------------------------------
def upload_items(items, folder, client)

  # Go through each item and upload it to Dropbox
  items.each do |item|
   upload_to_dropbox(items, folder, client)
  end
end

アプリケーションコントローラー:

def upload_to_dropbox(item, folder, client)
  # Get the file from the database to upload
  @model = current_user.send(folder).find_by_sync_id(item)
  # Upload it
  uploaded_file = client.put_file("/aircraft/#{item}.json",@model.to_json, overwrite = true)
  # Reset the updated_flag in the database
  @model.update_attributes(updated_flag: 0)
end
于 2013-01-09T17:34:13.153 に答える