șinele dau variabile lipsă

pentru aplicația mea de șine, mesajele mele de eroare nu se afișează corect. Cred că motivul a fost pentru că, pe o validare nereușită, controlorul meu a făcut o redirecționare spre deosebire de o render. cu toate acestea, am probleme cu redarea. toate variabilele mele par să lipsească. de exemplu, în editorii mei # creați am ...

def create
    @pub_message = current_user.pub_messages.build
    @pub_message.to_id = params[:pub_message][:to_id]
    @pub_message.user_id = current_user.id
    @pub_message.content = params[:pub_message][:content]
    if @pub_message.save
        flash[:success ] = "Your post has been sent"
        redirect_to user_path(params[:pub_message][:to_id])
    else
        render 'users/show'
    end
end

^ (pe o notă laterală, salvarea imediată a fiecărui atribut din cauza unei probleme de securitate, așa că nu am făcut: to_id attr_accessible)

dar înapoi pe punctul, atunci când fac "utilizatori/show", se pare că nu poate găsi nici una dintre variabilele mele. este vorba de vizualizarea utilizatorilor, care se plânge de ...

undefined method `name' for nil:NilClass
1: <% provide(:title, @user.name) %>

cu toate acestea, în cazul în care a mers la utilizatorii mei # arată acțiune, am declarat @user.

 def show
    @user = User.find(params[:id])
    @current_user = current_user
    if user_signed_in?
        @message = current_user.messages.build
        @pub_message = current_user.pub_messages.build
    end
    @feed_items = @user.feed.paginate(page: params[:page], per_page: 20)
 end

imi lipsesc sau fac ceva gresit? mulțumesc

UPDATE: așa că pare că nu merge la acțiunea spectacolului. Cum pot rezolva mesajele de eroare care nu se afișează? dacă fac o redirecționare, nu provoacă browserul să solicite imediat o pagină nouă? și, prin urmare, mesajele mele de eroare nu ar apărea niciodată?

UPDATE2: așa că ... im nu vin de fapt de pe pagina "nouă" a modelului, dar în schimb im provenind de la utilizatori arată șablon. și în șablon, am următoarele

<%= form_for([current_user, @pub_message])  do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
    <%= f.hidden_field :to_id, :value => @user.id %>
  <div class="micropost_message_field">
    <%= f.text_area :content, placeholder: "Comments?", :id => 'public_message_text' %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

unde se construiește obiectul și care, în cele din urmă, merge la editorul meu pub_messages # create. dacă fac reinițializarea tuturor variabilelor, trebuie să mișc toate șabloanele într-un dosar partajat, de asemenea, deoarece se plânge de asta.

sau există o modalitate mai bună de a face acest lucru? poate ca redarea "nou" și apoi redirecționarea către utilizatori # arată?

0

3 răspunsuri

You aren't calling the show action, you're just rendering the template, so @user does not get defined.

You might try another redirect instead of rendering the template.

0
adăugat

Când faci render, controlul merge direct de la această acțiune la șablonul de vizualizare și nu atinge user_controller. De aceea lipsesc variabilele tale.

Cu toate acestea, atunci când redirecționați, merge la user_controller ca și cum o nouă solicitare a venit de la utilizator.

Instead of render 'users/show', try redirect_to :controller => :users, :action => :show, :id => current_user.id

Redirecționarea afișează anunțurile și erorile flash. Redirecționarea este utilizată foarte frecvent în astfel de situații.

Asta ajută?

0
adăugat
oh i editat prin poștă. nu redirecționează nu arată validări eșuate?
adăugat autor Sasha, sursa
oh dang într-adevăr? hmmm, atunci trebuie să fie de la altceva ...
adăugat autor Sasha, sursa
dacă am scoate randa și a pus o redirecționare, atunci mesajele nu apar
adăugat autor Sasha, sursa
hmmm ar fi posibil sa vorbim cu tine?
adăugat autor Sasha, sursa
O redirecționare ar putea accesa flash , dar nu @ pub_message.errors care este ceea ce vrea @Sasha.
adăugat autor Rob Sobers, sursa
Redirecționarea afișează anunțurile și erorile flash.
adăugat autor Anil, sursa
Problema dvs. cu numele undefined method name = nil: NilClass` sau cu mesaje care nu se afișează?
adăugat autor Anil, sursa
Flash are trei arome: flash, flash.now și flash.keep. Incercati/cercetati aceste.
adăugat autor Anil, sursa
adăugat autor Anil, sursa

Redirecționarea va afișa mesaje flash, dar nu va afișa erori de validare. Deoarece nu setați un mesaj de eroare flash, cred că doriți să afișați erorile de validare pentru model. Pentru asta, va trebui să stai cu randul, nu să redirecționezi.

Pentru a face, trebuie să inițializați toate variabilele necesare pentru vizualizarea spectacolului (deși nu știu de ce nu faceți "nou", ceea ce se pare că se îndreaptă de la utilizator). Pentru a face acest lucru cu ușurință, puteți muta întregul conținut al metodei de afișare într-o altă metodă și puteți apela această metodă din spectacol și o creație nereușită.

def initialize_show_vars
   @user = User.find(params[:id])
    @current_user = current_user
    if user_signed_in?
        @message = current_user.messages.build
        @pub_message = current_user.pub_messages.build
    end
    @feed_items = @user.feed.paginate(page: params[:page], per_page: 20)
end

def show
  initialize_show_vars
end

def create
  
  if @pub_message.save
    
  else
    flash[:error] = "Didn't work"
    initialize_show_vars
    render 'users/show'
  end
end
0
adăugat
așa că ... im nu vin de fapt de pe pagina "nouă" a pub_messages, dar în schimb im provenind de la utilizatori arată șablon. dacă fac re-inițializarea tuturor variabilelor, trebuie să mișc toate șabloanele într-un folder partajat? sau există o modalitate mai bună de a face acest lucru? poate ca redarea "nou" și apoi redirecționarea către utilizatori # arată?
adăugat autor Sasha, sursa
@Gabriel Mă duc în aceeași problemă ca și @Sasha și mă gândeam să fac ceea ce sugerați, dar pare un pic păros. Este aceasta o bună practică? În mintea mea, este mai bine decât să folosiți redirect_to pentru că ar pierde @ pub_message.errors și îmi place coerența căutării întotdeauna a .errors pentru erorile de validare în loc de flash sau session , dar încă pare ciudat. Dacă render numea efectiv acțiunea, ar fi bine să mergem, dar văd cum ar putea fi problematică în alte cazuri.
adăugat autor Rob Sobers, sursa