[英]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')
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?
結束
結束
def make_assets
Photo.all.each做|照片|
newasset =零
newasset = Asset.create!(:user_id => photo.user_id,
:image => photo.image)
photo.destroy除非newasset.nil?
結束
結束
<%= 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.