Ruby on rails Rails 3:如何使用表单提交按钮执行rake任务

Ruby on rails Rails 3:如何使用表单提交按钮执行rake任务,ruby-on-rails,onclick,form-submit,Ruby On Rails,Onclick,Form Submit,我希望submit按钮操作在服务器端执行rails方法或rake任务。任务将记录从一个模型复制到另一个模型。我打算将该按钮添加到pages控制器的index视图的底部 我读过一些帖子,但仍然不知道如何使用远程功能。还尝试使用:onclick=>:make_assets,但没有任何结果。谢谢 e、 g.单选按钮:model,:method,:onclick=> 远程函数(:controller=>'some',:action=>'action') lib/tasks/move_photo.rake

我希望submit按钮操作在服务器端执行rails方法或rake任务。任务将记录从一个模型复制到另一个模型。我打算将该按钮添加到pages控制器的index视图的底部

我读过一些帖子,但仍然不知道如何使用远程功能。还尝试使用:onclick=>:make_assets,但没有任何结果。谢谢

e、 g.单选按钮:model,:method,:onclick=> 远程函数(:controller=>'some',:action=>'action')

lib/tasks/move_photo.rake 名称空间:db do
描述“将记录从照片移动到资产”
任务:movephoto=>:environment do
Rake::Task['db:migrate'].调用
制造资产
结束
结束

def make_资产
Photo.all.each do| Photo |
新资产=零
newasset=Asset.create!(:user\u id=>photo.user\u id,
:image=>photo.image)
photo.destroy,除非newasset.nil?
结束
结束

/app/controllers/photos\u controller.rb
def make_资产
Photo.all.each do| Photo |
新资产=零
newasset=Asset.create!(:user\u id=>photo.user\u id,
:image=>photo.image)
photo.destroy,除非newasset.nil?
结束
结束

/app/views/photos/index.html.erb




远程_函数(:controller=>:photos,:action=>:make_assets)%>

从控制器执行rake任务是一个非常糟糕的主意

绝不允许不受信任的客户端访问您的系统

也就是说,您真正想要做的似乎是符合控制器操作参数的事情。我认为您缺少远程函数调用中的
:url
散列:

<%= submit_tag 'Approve', :onclick => remote_function(:url => {:controller => :pages, :action => :make_assets}) %>
remote_函数(:url=>{:controller=>:pages,:action=>:make_assets})%>

从控制器执行rake任务是一个非常糟糕的主意

绝不允许不受信任的客户端访问您的系统

也就是说,您真正想要做的似乎是符合控制器操作参数的事情。我认为您缺少远程函数调用中的
:url
散列:

<%= submit_tag 'Approve', :onclick => remote_function(:url => {:controller => :pages, :action => :make_assets}) %>
remote_函数(:url=>{:controller=>:pages,:action=>:make_assets})%>

您可以使用
按钮\u尝试调用控制器操作的帮助程序:

<%= button_to 'Approve', :controller => :pages, :action => :make_assets %>
:页面,:操作=>:制作资产%>

如果要通过Ajax执行请求,请添加
remote=>true
参数

,您可以尝试使用
按钮\u调用控制器操作:

<%= button_to 'Approve', :controller => :pages, :action => :make_assets %>
:页面,:操作=>:制作资产%>

添加
remote=>true
参数,如果您想通过Ajax执行请求

您可以运行rake命令,就像从rails运行dos或shell命令一样。但正如我所看到的,您需要运行rake db:migrate,然后运行其他任务,并且根据我对rails的理解,您需要在运行此类rake任务后重新启动应用程序,以便在为当前运行的应用程序运行rake命令时出现问题

对于其他的东西,例如从一个模型复制记录到另一个模型,您可以在模型中有一个类方法(在您的例子中是Photo模型),并且可以在从UI调用的控制器操作中调用该方法。代码可能看起来像

照片模型

class Photo < ActiveRecord::Base

 def self.make_assets
  Photo.all.each do |photo|
   newasset = nil
   newasset = Asset.create!(:user_id => photo.user_id,
   :image => photo.image)
   photo.destroy unless newasset.nil?
  end
 end

end
在视图端,您可以使用各种选项来调用make_assets操作

1) 链接到

“制作资源”,:controller=>:photos),:remote=>true%>
2) 按钮

<%= button_to "Make Assets", 
    url_for( :action => "make_assets", :controller=> :photos ),:remote=>true %>
“制作资源”,:controller=>:photos),:remote=>true%>
3) 表格标签

(:action=>“制作资源”,:controller=>:照片),:remote=>true)do-%>
您可以运行rake命令,就像从rails运行dos或shell命令一样。但正如我看到的,您希望运行rake db:migrate,然后运行其他任务,根据我对rails的理解,您需要在运行此类rake任务后重新启动应用程序,以便在为当前运行的应用程序运行rake命令时出现问题

对于其他的东西,例如从一个模型复制记录到另一个模型,您可以在模型中有一个类方法(在您的例子中是Photo模型),并且可以在从UI调用的控制器操作中调用该方法。代码可能看起来像

照片模型

class Photo < ActiveRecord::Base

 def self.make_assets
  Photo.all.each do |photo|
   newasset = nil
   newasset = Asset.create!(:user_id => photo.user_id,
   :image => photo.image)
   photo.destroy unless newasset.nil?
  end
 end

end
在视图端,您可以使用各种选项来调用make_assets操作

1) 链接到

“制作资源”,:controller=>:photos),:remote=>true%>
2) 按钮

<%= button_to "Make Assets", 
    url_for( :action => "make_assets", :controller=> :photos ),:remote=>true %>
“制作资源”,:controller=>:photos),:remote=>true%>
3) 表格标签

(:action=>“制作资源”,:controller=>:照片),:remote=>true)do-%>
是的,rake任务不打算从控制器运行。考虑重构和提取任务功能来分离方法。然后可以从rake任务和控制器操作调用此方法

老实说,在意识到重构的必要性之前,我想用这种方式调试我的rake任务

对于要运行的代码,您必须手动加载任务,并且不要忘记重新启用任务以便再次运行它

require 'rake'

Rake::Task.clear # necessary to avoid tasks being loaded several times in dev mode
Sample::Application.load_tasks # providing your application name is 'sample'

class RakeController < ApplicationController

  def run
    Rake::Task[params[:task]].reenable # in case you're going to invoke the same task second time.
    Rake::Task[params[:task]].invoke
  end

end
require'rake'
Rake::Task.clear#避免在开发模式下多次加载任务所必需的
示例::Application.load_tasks#提供的应用程序名称为“Sample”
类RakeControl<应用程序控制器
def运行
Rake::Task[params[:Task]].可重新启用#以防第二次调用同一个任务。
Rake::Task[params[:Task]]。调用
结束
结束

您可以在初始化部分要求“rake”和.load_任务。

是的,rake任务不打算从控制器运行。考虑重构和提取任务功能来分离方法。那你呢