Dove metto i metodi 'helper'?
-
03-07-2019 - |
Domanda
Nella mia app Ruby on Rails, ho:
class AdminController < ApplicationController
def create
if request.post? and params[:role_data]
parse_role_data(params[:role_data])
end
end
end
e anche
module AdminHelper
def parse_role_data(roledata)
...
end
end
Tuttavia, viene visualizzato un errore che indica che parse_role_data
non è definito. Cosa sto sbagliando?
Soluzione
Gli helper vengono utilizzati principalmente per attività complesse correlate all'output, come la creazione di una tabella HTML per il calendario da un elenco di date. Tutto ciò che riguarda le regole aziendali come l'analisi di un file dovrebbe andare nel modello associato, un possibile esempio di seguito:
class Admin < ActiveRecord::Base
def self.parse_role_data(roledata)
...
end
end
#Call in your controller like this
Admin.parse_role_data(roledata)
Cerca anche di utilizzare (RESTful route o l'opzione: condition) [ http: //api.rubyonrails.org/classes/ActionController/Routing.html] durante la creazione di percorsi, anziché controllare request.post?
nel controller.
Altri suggerimenti
Non dovresti accedere a parse_role_data tramite AdminHelper?
Aggiornamento 1: controlla questo http://www.johnyerhot.com / 2008/01/10 / rotaie-utilizzando-aiutanti-in-you-Controller /
Dall'aspetto di se stai cercando di creare un'interfaccia utente per aggiungere ruoli agli utenti. Presumo che tu abbia già un UsersController, quindi suggerirei di aggiungere un modello di ruolo e un RolesController. Nel tuo route.rb faresti qualcosa del tipo:
map.resources :users do |u|
u.resources :roles
end
Questo ti permetterà di avere un percorso come:
/users/3/roles
Nel tuo RolesController faresti qualcosa del tipo:
def create
@user = User.find_by_username(params[:user_id])
@role = @user.roles.build(params[:role])
if @role.valid?
@role.save!
redirect_to @user
else
render :action => 'new'
end
end
Ciò prenderà i dati dei parametri di ruolo dal modulo visualizzato nella nuova azione e creerà un nuovo modello di ruolo per questo utente. Spero che questo sia un buon punto di partenza per te.