2011-05-15 43 views
0

我想提交按钮操作来在服务器端执行rails方法或rake任务。该任务将记录从一个模型复制到另一个模型。我打算将按钮添加到页面控制器的索引视图的底部。Rails 3:如何使用表单提交按钮执行rake任务

我读过一些帖子,但仍无法弄清楚如何使用remote_function。还尝试使用:onclick =>:make_assets,但没有任何反应。谢谢

例如radio_button:模型,:方法,:的onclick => remote_function(:控制器=> '一些',:动作=> '动作')

LIB /任务/ move_photo.rake

名称空间:DB做
DESC “从照片移到记录资产”
任务:movephoto =>:环境做
耙::任务。[ '分贝:迁移']调用
make_assets
结束
结束

def make_assets
Photo.all.each do | photo |
newasset =零
newasset = Asset.create!(:USER_ID => photo.user_id,
:图像=> photo.image)
photo.destroy除非newasset.nil?
结束
结束

/app/controllers/photos_controller.rb

高清make_assets
Photo.all.each做|图片|
newasset =零
newasset = Asset.create!(:USER_ID => photo.user_id,
:图像=> photo.image)
photo.destroy除非newasset.nil?


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

<%= will_paginate%>


<%= will_paginate%>
<%= submit_tag'批准',:onclick = > remote_function(:controller =>:photos,:action =>:make_assets)%>

+1

看一下'system'命令 – apneadiving 2011-05-15 18:21:28

回答

2

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

永远不要让不可信的客户端访问您的系统。

这就是说,你真正想做的事情似乎很适合控制器操作的参数。我认为你缺少:url哈希远程函数调用:

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

指向一点,我会继续从shell运行rake任务。有一个错字:页面控制器应该是:照片。尝试,但得到了以下错误---没有路线匹配{:控制器=>“照片”,:行动=>“make_assets”}。 – Mike 2011-05-17 18:12:34

+0

我创建了一个虚拟视图make_assets.html.erb,它的工作!谢谢。不知何故,我需要再次刷新视图才能看到单击按钮后的更改。 :) – Mike 2011-05-17 18:43:10

0

您可以用button_to助手尝试调用控制器动作:

<%= button_to 'Approve', :controller => :pages, :action => :make_assets %> 

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

1

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

从一个模式到另一个其他的东西也就是拷贝记录,你可以(在你的情况的照片模式)模式中的一个类的方法,并可以调用控制器的作用是方法,从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 

照片控制器

def make_assets 
Photo.make_assets 
end 

视图方面,你有不同的选项来调用make_assets行动

1)的link_to

<%= link_to "Make Assets", 
    url_for(:action => "make_assets", :controller=> :photos),:remote=>true %> 

2)button_to

<%= button_to "Make Assets", 
    url_for(:action => "make_assets", :controller=> :photos),:remote=>true %> 

3)form_tag的

<% form_tag(:url => url_for(:action => "make_assets", :controller=> :photos),:remote => true) do -%> 
    <div><%= submit_tag 'Save' %></div> 
    <% end -%> 
1

,耙任务不旨在被从控制器中运行。考虑重构和提取采取任务功能来分离方法。然后你可以从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 

您可以在初始化部分要求'rake'和.load_tasks。