2012-10-31 3 views
0

J'ai besoin d'effectuer un appel système à partir de la méthode Ruby of Rails, mais je veux qu'il reste sur la même page. En ce moment, pour une raison quelconque, il n'exécute pas, mais montre:Appel système à partir de la méthode (ruby on rails)

Routing Error 

No route matches [POST] "/devices/22918" 
Try running rake routes for more information on available routes. 

Ceci est le bouton:

<%= link_to image_tag("/images/glossy_green_button.png"), device , :method => :turnon, :confirm => "Are you sure?" %> 

Ceci est la méthode:

def turnon 
@device = Device.find(params[:id]) 
result = `/perl/toggle.pl @device.infodot on` 
end 

s'il vous plaît laissez-moi savoir ce que je Je fais mal,

merci

D

+0

Si vous voulez que l'utilisateur de rester sur la même page, vous ne devriez pas utiliser ajax? Le link_to signale à votre application rails qu'il y a une nouvelle page que vous voulez que l'utilisateur visite. – Josh

Répondre

2

Vous n'utilisez simplement pas le method correctement. Vous l'utilisez pour cibler le action du contrôleur que vous voulez exécuter (notez que j'ai explicitement dit action et non méthode pour plus de clarté). actions disponibles dans un contrôleur sont définis par votre routes.rb file.You devrait éventuellement lire ou re lire that

Dans votre cas, disons que vous avez une ressource device (je suppose que c'est ce que vous avez), vous devrez d'abord créer une nouvelle action dans votre fichier routes.rb

resources :devices do 
    put :turnon, on: :member 
end 

Vous pouvez lire doc sur cette syntaxe here, mais au fond, je fais l'action turnon disponible via le HTTP PUT method sur chaque appareil, ce qui signifie qu'il sera accessible par l'URL /devices/1/turnon ou via le url_helper: turnon_device_path (ou turnon_device_url)

Je suppose que votre action turnon modifiera les choses existantes, ne pas créer de nouvelles choses, voilà pourquoi j'utilise le verbe PUT

Ensuite, le lien ressemblera à quelque chose comme:

<%= link_to image_tag("/images/glossy_green_button.png"), turnon_device_path(device) , :method => :put, :confirm => "Are you sure?" %> 

voir que la méthode est la méthode HTTP correspondant à la nouvelle route que j'ai créée. Je suppose également que vous mettez la méthode turnon dans le DevicesController.

Enfin, comme vous voulez le faire en ajax, vous pouvez consulter un l'remote: trueoption

+0

Ne pas besoin de colonne après mettre je suppose, merci, il semble être plus proche de travailler, mais il charge pendant 5 minutes pour une raison quelconque. Et puis 'Modèle est manquant manquant modèle de périphériques/turnon, application/Turnon avec {: locale => [: en],: formats => [: html],: handlers => [: erb,: builder,: café ]}.Recherché dans: * "/ var/www/ruby ​​/ réservation/app/views" ' –

+0

vient de remarquer que j'avais fait une faute de frappe c'est:' put: turnon, sur:: member' pas 'put:' – pjam

+0

c'est logique, l'action essaie de rendre une vue, si vous faites appel à json, vous pouvez simplement faire 'rendre json: @ device' si vous avez chargé le' device' actuel dans 'device' bien sur – pjam

Questions connexes