0

views/admin/index.html.erb次のように作成したボタンがあるビューがあります...

ビュー/管理者/index.html.erb

<%= button_to 'Manual Scrape', {:controller => "jobs", :action => "create", :job_type => "StatsAll"}, :method=>:post, :class => "btn btn-primary"  %>

controllers/jobs_controller.rb

  def create

    call_rake :import_records, :job_type => params[:job_type]
    flash[:notice] = "Import is executing..."

  end

コントローラー/application_controller.rb

  def call_rake(task, options = {})
    options[:rails_env] = Rails.env
    args = options.map { |n, v| "#{n.to_s.upcase}='#{v}'" }
    system "/usr/bin/rake #{task} #{args.join(' ')} --trace >> #{Rails.root}/log/rake.log &"
  end

ボタンをクリックすると、現在のビューのままにしviews/admin/index.html.erbたいと思います。ジョブビューがなく、それが必要だとは思わないためです(誰かがそうでなければ私を納得させるかもしれません...)。私がやろうとしているのは、ボタンをクリックしてから、そのビューでボタンをjobs_controller.rb、必要に応じてジョブを強制終了するために別のアクションを呼び出すボタンに変更することです。それ以外の場合は、完了するまで実行されます。

ただし、現在、ジョブビューを見つけようとしていますが、そこにはありません。どうすればこれを修正できますか?

注: Railscast #127 のコードの一部を使用して、バックグラウンド タスクを実行する方法を確認しました。

4

3 に答える 3

1

ページをリロードしたくない場合は、JavaScript/AJAX を使用していつでもこれを行うことができます。何よりもまず、ジョブ関数のジョブ コントローラーへのパスがあると思いますか? rake routesジョブ コントローラーの create 関数の GET ではなく、POST を実行して確認します。私はあなたがそれをすでにそこに持っているためにここまでやってきたと思います.

ビューでは、次のように変更します。

<%= button_to 'Manual Scrape', jobs_create_path, :method=>:post, :remote => true, :class => "btn btn-primary"  %>

あなたのパスは異なる場合があり、そこにあったような何らかの値を取りたいと思うかもしれません:job_type => "StatsAll"が、正確にはわかりません.

:remote => true?のその部分がわかります。そこで、特別な AJAX が発生します。ただし、もっと複雑なものが必要な場合は、そうすることができます (ただし、それはより多くの作業です)。しかし、これが create.js.erb への移行を開始する簡単な方法です。

app/views/jobs に create.js.erb を作成して、escape_javascript でボタンを再レンダリングできるボタンを作成します (やりたいと言ったように)。再レンダリングした後、含めたい他の機能に対しても同じプロセスを実行できます。

$('#create_button').html('<%= escape_javascript(render partial: "shared/create_job") %>'); // May need to use whatever locals you need to in here.

関数を呼び出してページにとどまり、ボタンを変更するだけなので、これでうまくいくはずです。

また、上記のコードでは、ボタンにパーシャルを使用していることを前提としています。これは、ページを完全に再レンダリング/リロードする必要がなく、ボタンに対応する部分的な部分だけを行うためです。

于 2013-07-13T20:01:53.520 に答える