2012-05-02 12 views
5

w kontrolerze mam stworzyć akcjęSzyny zdać dodatkowy parametr do modelu

def create 

    params[:note] 
    @note = current_user.notes.new(params[:note]) 

     if @note.save 
     respond_with @note, status: :created 
     else 
     respond_with @note.errors, status: :unprocessable_entity 
     end 
    end 

Chcę przekazać do modelu inny param zwanego current_user, jak to zrobić i jak przy sprowadzaniu przekazany param w sposób metoda modelowania?

+0

do jakiego modelu zrobić y chcesz przekazać ten param? – MrDanA

Odpowiedz

3
@note = Note.new(params[:note].merge(:user_id => current_user.id)) 

Ale może nie jest to najlepszy sposób, jak to zrobić, spójrz na to: Adding variable to params in rails

Jeśli chcesz otrzymać dostęp do current_user w modelu, patrz: Rails 3 devise, current_user is not accessible in a Model ?

+1

Nie musisz "scalać", kiedy możesz po prostu przypisać bezpośrednio: 'params [: note] [: user_id] = current_user.id' Pamiętaj, że' merge' zwraca kopię, więc to nie zmienia parametrów, ale zamiast tego zwraca wersję z dodatkowymi wpisami. – tadman

+0

Dzięki za wyjaśnienia. Kiedy pisałem odpowiedź, zamierzałem użyć 'merge' podczas wywoływania' new'. tzn .: 'Note.new (params [: note] .merge (: id_użytkownika => current_user.id))' Czy to jest poprawne? –

+0

Ma to sens, ponieważ używasz wyniku. 'scalanie' w pustym kontekście jest prawie zawsze bezcelowe. – tadman

1

Zwykle robisz to z hidden_field.

Tak więc w widoku tworzenia dodajesz pole current_user jako ukryte pole.

<%= form_for @note do |f| %> 
    # all your real fields 
    <%= f.hidden_field :current_user current_user %> 
<% end %> 

następnie w tworzenie params kontrolera [: Uwaga] [: current_user] byłyby zdefiniowane, a dodany do modelu, przyjmując model posiada atrybut o nazwie 'current_user'

+5

Podczas dodawania niestandardowych ukrytych pól może być pomocne, nie byłoby dla current_user. Zbyt złośliwy użytkownik może łatwo zmienić treść formularza przed jego przesłaniem. Teraz masz w swoim stole zapis, który mówi, że Bob coś zrobił, kiedy naprawdę była to Alicja ... Przesuń ją do kontrolera, jak sugeruje to Mikhail. – Unixmonkey

Powiązane problemy