2013-05-13 10 views
56

W Rails 3, można było wstawić atrybut do params tak:Szyny 4: Włóż Atrybut Do Params

params[:post][:user_id] = current_user.id 

ja próbuje zrobić coś podobnego w Rails 4, ale nie mającą szczęścia:

post_params[:user_id] = current_user.id 

. . . . 


private 

    def post_params 
    params.require(:post).permit(:user_id) 
    end 

Railsy ignorują to wstawianie. Nie rzuca żadnych błędów, po prostu cicho zawodzi.

Odpowiedz

115

Znaleziono odpowiedź here. Zamiast wstawiania atrybutu z akcji kontrolera, można go wstawić do definicji paramba z łączeniem. Aby rozwinąć na moim poprzednim przykładzie:

private 

    def post_params 
    params.require(:post).permit(:some_attribute).merge(user_id: current_user.id) 
    end 
+3

Dzięki, potrzebne do korzystania deep_merge, ponieważ moje atrybuty są zagnieżdżone ... – stephenmurdoch

+0

@marflar użyłeś 'deep_merge' w konstruktorze params? Lub gdzie indziej w twoim kontrolerze? –

+0

Tak też to robię, ale wciąż myślę, że musi być jakiś sposób, aby to trochę DRY. Wszystkie moje 50+ kontrolery mają podobne instrukcje .merge w ścisłym zakresie params. W moim przypadku scalam current_user w updated_by. Łączę current_user do created_by tylko w metodzie create. – Dan

27

Oprócz odpowiedzi @ timothycommoner użytkownika, można alternatywnie wykonać scalanie na podstawie za działania:

def create 
    @post = Post.new(post_params.merge(user_id: current_user.id)) 
    # save the object etc 
    end 

private 
    def post_params 
    params.require(:post).permit(:some_attribute) 
    end 
+1

Hej, jak byś to zrobił dla zagnieżdżonego? zasób? – Patient55

+0

Nie jestem pewien, dlaczego, ale odpowiedź @ timothycommoner nie działa dla mnie. tylko ten jeden ... próbowałem nawet "scalić!" i to wciąż się nie udawało. No cóż, to i tak jest łatwiejsze, ponieważ nie ma kopania prywatnymi metodami i łatwiej jest je zmieniać w różnych przypadkach użycia. – james

+0

@ Patient55 Domyślam się, że potrzebujesz 'deep_merge', jak to omówili w komentarzach wybranej odpowiedzi. – Wit

0

Jako alternatywę dla tego przypadku można wymagany atrybut wprost poprzez scope:

current_user.posts.create(post_params)