0

ユーザーが時間を選択または入力できるようにしたい(例:「朝の歯磨きにどのくらいの時間を費やしますか?」)。「CREATE」または「UPDATE」アクションで、時間を変換したいと思います。データベースへのポスト/プットの数秒前にフロートします。

現在、モジュールにメソッドがあります(モジュールの使用方法を学習しようとしています)が、この状況に適しているかどうかはわかりません...

Float-to-Time for View(作品)

<%= MyModule.float_to_time(task.task_length) %>

モジュール

module MyModule

  def self.float_to_time(secs)       # task.task_length (view)
     ...
     ...
  end

  def self.time_to_float(tim)        # :task_length (controller)
     m = tim.strftime("%M").to_f
     s = tim.strftime("%S.%2N").to_f
     t = ((m*60) + s)
     return t.round(2)
  end

end

コントローラ

def create
  # "time_to_float" (Convert task_time to seconds float)
  # Create new task after conversion
  @task = Task.new(params[:task])

  respond_to do |format|
    if @task.save
      format.html { redirect_to @task, notice: 'Task was successfully created.' }
      format.json { render json: @event, status: :created, location: @task }
    else
      format.html { render action: "new" }
      format.json { render json: @task.errors, status: :unprocessable_entity }
    end
  end
end

dbへの投稿(または配置)の前に変換を行うにはどうすればよいですか?

また、これらのメソッドをapplication_controllerに移動する必要がありますか、それともモジュールは問題ありませんか?

-助けてくれてありがとう。

4

3 に答える 3

1

私には、これはコントローラーではなく、モデルの仕事のように思えます。モデルは、データの保存方法と、必要に応じてデータ型を変換する方法に関係している必要があります。

モジュールの使用方法を学習しようとしているので、これらのメソッドをインスタンスメソッドとしてモジュールに保持し、モデルクラスに混在させることができます。

module TimeConversions
  def time_to_float(time)
    # ...
  end

  def float_to_time(seconds)
    # ...
  end
end

class Task
  extend TimeConversions
  before_save :convert_length

  # ...

private

  def convert_length
    self.length = self.class.time_to_float(length) if length.to_s.include?(':')
  end
end

その後float_to_time、ビューで引き続き使用できます。

<%= Task.float_to_time(task.length) %>

あなたはおそらくあなたのbefore_saveフィルターでもっと洗練された何かをするでしょう、しかし多分これはあなたにいくつかのアイデアを与えるでしょう。

于 2013-03-04T14:11:25.467 に答える
1

また、task_length アクセサーのセッターとゲッターをオーバーライドすることもできます。このように(タスクモデルで):

class Task < ActiveRecord::Base

  def task_length=(tim)
    m = tim.strftime("%M").to_f
    s = tim.strftime("%S.%2N").to_f
    t = ((m*60) + s)
    write_attribute(:task_length, t.round(2))
  end

  def task_length_to_time
    tl = read_attribute(:task_length)
    # ... float-to-time stuff
  end
end

そしてそれをビューで使用します<%= task.task_length_to_time %>task.task_lengthフロートで必要な場合に使用します。

于 2013-03-04T14:14:15.040 に答える
1

ActiveRecord Callbackを探していると思います。

この場合、次のようなものがあります。

class Task < ActiveRecord::Base
  before_save :convert_task_length_to_float

  def convert_task_length_to_float
    # do the conversion. set `self.task_float =` to update the value that will be saved
  end
end

がデータベースに保存される前に、before_saveコールバックが呼び出されます。Task

于 2013-03-04T14:11:56.513 に答える