Rails 3: Как выполнить грабли с помощью кнопки отправки формы - PullRequest
1 голос
/ 15 мая 2011

Я бы хотел, чтобы действие кнопки submit выполняло метод rails или задачу rake на стороне сервера.Задача копирует записи из одной модели в другую.Я намерен добавить кнопку в нижней части индексного представления контроллера страниц.

Я прочитал несколько постов, но все еще не могу понять, как использовать функцию remote_function.Также попытался использовать: onclick =>: make_assets, но ничего не происходит.Спасибо

например radio_button: model,: method,: onclick => remote_function (: controller => 'some',: action => 'action')

lib / tasks / move_photo.rake

пространство имен: db dodesc "Переместить записи из фотографий в активы"task: movephoto =>: окружающая средаRake :: Task [ 'дб: мигрировать'] вызова.make_assetsконецконецdef make_assetsPhoto.all.each do | фото |newasset = нольnewasset = Asset.create! (: user_id => photo.user_id,: image => photo.image)фото.дрой разве newasset.nil?конецконец

/ app / controllers / photos_controller.rb

def make_assetsPhoto.all.each do | фото |newasset = нольnewasset = Asset.create! (: user_id => photo.user_id,: image => photo.image)фото.дрой разве newasset.nil?конецконец

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

<% = will_paginate%>

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

Ответы [ 4 ]

2 голосов
/ 15 мая 2011

Выполнение грабли с контроллера - очень плохая идея.

Никогда не предоставляйте ненадежному клиенту доступ к вашей системе.

Тем не менее, похоже, что вы действительно хотите сделать что-то, что хорошо вписывается в параметры действия контроллера. Я думаю, что вам не хватает хеша :url в удаленном вызове функции:

<%= submit_tag 'Approve', :onclick => remote_function(:url => {:controller => :pages, :action => :make_assets}) %>
1 голос
/ 30 марта 2012

Да, грабли не предназначены для запуска с контроллера. Рассмотрите возможность рефакторинга и извлечения функциональности задачи «Взять» в отдельный метод. Затем вы можете вызвать этот метод как из задачи 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 в разделе инициализации.

1 голос
/ 15 мая 2011

вы можете запустить команду rake, это все равно что запустить команду dos или shell из rails. Но, как я вижу, вы хотите запустить rake db: migrate, а затем выполнить какую-то другую задачу, и, согласно моему пониманию rails, вам нужно перезапуститьприложение после запуска таких задач rake, что может создать проблему, если вы запускаете команду rake для текущего запущенного приложения.

Для других вещей, например, копирования записей из одной модели в другую, вы можете иметь метод класса в Model(Модель фото в вашем случае) и может вызывать этот метод в действии контроллера, который вызывается из пользовательского интерфейса.Код может выглядеть как

photo Модель

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 -%>
0 голосов
/ 15 мая 2011

Вы можете попробовать с помощью помощника button_to для вызова действия контроллера:

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

добавить параметр remote => true, если вы хотите выполнить запрос через Ajax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...