Rails:如何在不更改视图的情况下调用控制器的创建操作?

时间:2013-07-13 18:00:38

标签: ruby-on-rails view controller routes rake

我有一个视图,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上调用另一个操作以在必要时终止该作业的按钮,否则它将执行直到完成。 / p>

但是目前它试图找到没有的作业视图。我怎么能纠正这个?

注意:我使用了Railscast#127中的一些代码来了解如何运行后台任务。

3 个答案:

答案 0 :(得分:1)

如果您不想重新加载页面,可以使用某些JavaScript / AJAX执行此操作。首先,我假设你有一个工作控制器的工作路径的路径?通过执行rake routes查找并查看POST的位置,而不是作业控制器中创建功能的GET。我认为你已经做到这一点,已经把它放在那里了。

对于您的观点,请将其更改为:

<%= 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.

这应该这样做,因为看起来你想做的只是调用一个函数,然后留在页面上,但是改变按钮。

此外,对于上面的代码,这假设您使用按钮的部分。这样您就不必完全重新渲染/重新加载页面,只需要与按钮对应的部分。

答案 1 :(得分:0)

所以我发现我可以通过在操作结束时执行redirect_to来指定要访问的页面。像这样......

  def create
    # Do stuf...
    redirect_to 'admin/#page-i-was-at'
  end

答案 2 :(得分:0)

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

def create    
  call_rake :import_records, :job_type => params[:job_type]
  redirect_to :back, notice: "Import is executing..."
end