簡體   English   中英

Rails 3:如何使用表單提交按鈕執行rake任務

[英]Rails 3: How to execute rake task with form submit button

我希望提交按鈕操作在服務器端執行rails方法或rake任務。 該任務將記錄從一個模型復制到另一個模型。 我打算將按鈕添加到頁面控制器的索引視圖的底部。

我已經閱讀了一些帖子,但仍然無法弄清楚如何使用remote_function。 還嘗試使用:onclick =>:make_assets但沒有任何反應。 謝謝

例如radio_button:model,:method,:onclick => remote_function(:controller =>'some',:action =>'action')

LIB /任務/ move_photo.rake

namespace:db do
desc“將記錄從照片移動到資產”
任務:movephoto =>:環境做
耙::任務[“分貝:遷移”]調用。
make_assets
結束
結束

def make_assets
Photo.all.each做|照片|
newasset =零
newasset = Asset.create!(:user_id => photo.user_id,
:image => photo.image)
photo.destroy除非newasset.nil?
結束
結束

/app/controllers/photos_controller.rb

def make_assets
Photo.all.each做|照片|
newasset =零
newasset = Asset.create!(:user_id => photo.user_id,
:image => 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)%>

從控制器執行rake任務是一個非常糟糕的主意。

永遠不要讓不受信任的客戶端訪問您的系統。

也就是說,看起來你真正想做的事情就是適合控制器動作的參數。 我想你在遠程函數調用中缺少:url hash:

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

你可以運行一個rake命令,就像從rails運行dos或shell命令一樣。但是我可以看到你想要運行rake db:migrate然后執行其他一些任務,並且按照我的下面的rails,你需要重啟應用程序之后運行這樣的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 -%>

是的,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

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

您可以嘗試使用button_to幫助程序來調用控制器操作:

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

如果要通過Ajax執行請求,請添加remote => true參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM