0

私はRubyonRailsにかなり慣れていません。私は、PHPから来ました。構文を理解するだけでなく、構造を理解するための優れたプラクティスもたくさんあることに気づきました。

私が現在行っていることは機能していますが、私はそれを最善の方法で行っていないことはほぼ確実です。

これが私がしていることです。AJAXを介してクリックを追跡し、データベースのレコードを更新して、人気のあるアクセスポイントを監視しています。

これが私のコントローラーです:

class AjaxController < ApplicationController

  def track    
    elem = Tracking.where('element = ?', params[:element]).first
    if elem.nil?
      Tracking.create(:element => params[:element], :count => 0)
    else
      elem.count = elem.count + 1
      elem.save
    end
    render :text => 'ok'
  end

  def validate
    if request.xhr? && respond_to?(params[:callback])
      return self.send(params[:callback])
    end
    no_access
  end

  private

  def no_access
    redirect_to root_url
  end

end

これが私のモデルです:

class Tracking < ActiveRecord::Base
  attr_accessible :element, :count
end

追跡テーブル:

+-------------------------+
| id | element    | count |
+-------------------------+
| 1  | bazinga    |   3   |
---------------------------

何かがリファクタリングできれば、誰かが私を正しい方向に導くことができますか?

4

3 に答える 3

2

Railsの変換に関していくつかのリファクタリングが見られます。ただし、特定の理由がある場合は、これらをオーバーロールすることができます。

1-モデル名(これは正しいと思います。テーブル名を再確認してください)

理想的には、Railsには複数形のテーブルと、単数形のモデルがあります。したがって、テーブルは次のようにtrackingsなり、モデルは次のようになります。Tracking

2-コントローラー

トラッキングモデルを参照しているため、慣例により、コントローラー名はTrackingsController

また、RailsはRESTアプローチを使用しているため、デフォルトの7つのコントローラーアクションを維持するように最善を尽くしてください(コンテキストで意味がある限り)。デフォルトのRESTコントローラーアクションは

index

show

new

create

edit

update

destroy

だから私はあなたのクリックが次のように一致することができると思いますTrackings -> create

また、no_accessメソッドは、どのコントローラーでも使用できるため、ApplicationControllerに移動できます。

プログラムロジック

通常、ドメインログインはコントローラーに書き込まないため、コントローラーの以下の部分

elem = Tracking.where('element = ?', params[:element]).first
if elem.nil?
  Tracking.create(:element => params[:element], :count => 0)
else
  elem.count = elem.count + 1
  elem.save
end

次のようなモデルに移動できます

class Tracking < ActiveRecord::Base
  attr_accessible :element, :count

  def self.track(params)
    #your creation and counter update login
  end

end

とあなたのコントローラーで

def create
    Tracking.track(params)
    render :text => 'ok'
 end
于 2012-09-09T06:34:47.720 に答える
1

コントローラは、RESTfulな設計の恩恵を受けることができます。コントローラをリソースで動作させる-AjaxControllerはこの例ではありません。

no_accessに移動し、認証のためにCanCanApplicationControllerを追加して、コードを乾燥させます。

検証が必要な場合もありますが、モデルは問題ありません。また、スキーマでnull以外を指定します。

最後に、他の人々のコードを読み続けてください。そして、あなた自身のコードを書き続けてください。そして、あなたは時間内に良くなるでしょう。

于 2012-09-09T06:31:36.303 に答える
1

sameera207が言ったことに加えて、次のfind_or_create_メソッドを使用してレコードを検索または作成するプロセスを短縮できます。

Tracking.find_or_create_by_element(params[:element])

編集

増分値は次の方法で処理できます。

tracking = Tracking.find_or_create_by_element(params[:element]) do |t|
  t.count = 1
end
tracking.count += 1
tracking.save
于 2012-09-09T17:18:15.947 に答える