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"  %>

控制器/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并查看您的 POST 位置,而不是作业控制器中 create 函数的 GET 位置。我认为你已经做到了这一点,已经在那里了。

根据您的观点,将其更改为:

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

您的路径可能有所不同,并且想要获取某种价值,就像:job_type => "StatsAll"您在其中所拥有的那样,但我不确定。

你看到那部分了:remote => true吗?这就是特殊的 AJAX 发生的地方。如果你想要更复杂的东西,它可以(但它的工作量更大)。但这是开始创建.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 回答
0

所以我发现我可以通过redirect_to在操作结束时执行 a 来指定要转到哪个页面。像这样...

  def create
    # Do stuf...
    redirect_to 'admin/#page-i-was-at'
  end
于 2013-07-13T18:40:32.663 回答
0

您可以使用以下内容进行create操作。

def create    
  call_rake :import_records, :job_type => params[:job_type]
  redirect_to :back, notice: "Import is executing..."
end
于 2013-07-13T19:04:59.877 回答