2016-06-11 20 views
5

aventi due items_controller, uno per l'api (in app/controllers/api /) e uno per il back-end (in app/controllers/backend)Rails/parametri forti condivise tra due controllori

I parametri forti sono piuttosto lunghi (20 campi o qualcosa) e richiedono un po 'di evoluzioni. Non sarebbe impossibile mantenere questo elenco in entrambi i controller, ma dato che le esigenze sono più o meno le stesse nelle azioni create/updates, starei cercando di condividere la definizione dei parametri forti in un file separato che sarebbe condiviso per sia

ho cercato di ereditare quei due con un controller eccellente tra cui solo i forti definizione del parametro:

class SharedItemsController < ApplicationController 
    private # not knowing all the prerequisites of this, I tried also using protected instead of private; same result 
    def item_params 
     .... 
    end 
    end 
end 
class Frontend::ItemsController < SharedItemsController 
    ... 
end 
class Api::ItemsController < SharedItemsController 
    ... 
end 

Nessun successo, mi sono bloccato con parametri non consentiti

sperare di ottenere alcuni consigli su questo qui su SO; migliore

+0

Che cosa si intende, senza successo? Dovrebbe aver funzionato. –

+0

In ogni caso, usare l'ereditarietà per condividere il codice è una cattiva idea. Prova a mettere il metodo dei parametri forti in un modulo e includilo. –

+0

@SergioTulentsev potrebbe google, ma penso che accetterei la tua risposta se avessi alcuni suggerimenti su questo, provenienti da una fonte consigliata. devo dire che non sono così familiare con i moduli – Ben

risposta

5

grazie a @SergioTulentsev; in questo caso uno schema di base e preferibile sarebbe utilizzare un modulo. Ad esempio, in lib/items_controller_params.rb:

module ItemsControllerParams 
    def item_params 
    params.require(:item).permit(
     .. your fields here ... 
    ) 
    end 
end 

allora potrebbe essere inclusi nei controllori interessati come di seguito:

class Api::ItemsController < ApplicationController 
    include ItemsControllerParams 
    ... 
    end 
-1

Io in realtà non farti Perché non mettendo

private 

def item_params 
    params.require(:item).permit(your_fields_name) 
end 

in particolare controller?

se pensi di avere 20-30 campi e ti confonderà aggiungere tutti i campi e se in futuro avrò bisogno di utilizzare gli attributi annidati, sarà ancora più complicato. Così a portata di mano

private 

def item_params 
    params.require(:item).permit! 
end 

permesso con! e non è più necessario definire ogni singola colonna in params anche se è nidificata. Buona fortuna.

+0

Hai perso il punto? Ha bisogno di questo metodo in due controller. –

+0

Potrei, ma visto che questa parte di codice sarà quasi la stessa, ed è già abbastanza lunga (l'ho accorciata ma ho già degli attributi annidati, quindi puoi raddoppiare il conteggio dei campi), ho sentito come trovare un modo per condividerlo correttamente. Entrando in 'permesso!'-si tutto sembra un po 'yolo; ma potrei sbagliarmi a pensare che per alcuni motivi – Ben

+0

@ Ben: si, usando "permetti!" kinda sconfigge il punto. –