Frage

Hallo, ich möchte das vorbereiten, indem ich sage, dass ich neu im Codieren bin.

Ich habe ein Problem, von dem ich glaube, dass er auf zwei Arten gelöst werden kann

A. durch teilweises Rendern

B. durch Aktualisierung des Controllers

(Ich kann mich total irren, aber das ist was ich vermute lol)

Ich habe zwei Controller/Ansichten "Bewertungen" und "Protokolle". Und ich möchte, dass sie beide auf derselben Seite erscheinen.

Wie kann ich das machen? Ich habe versucht, einen teilweisen Rendern zu machen, aber ich bekomme immer einen Fehler.

Und ich habe den Code unten ausprobiert:

Dadurch wurden meine Bewertungen auf der Seite angezeigt, aber wenn ich hinzufüge

@log = @user.logs.all 

Damit zieht es nicht alle Protokolle auf die Seite, wie es für die Bewertungen der Fall ist.

def show
  @user = User.find_by_name(params[:id])
  if @user 
    @reviews = @user.reviews.all
    render action: :show
  else
    render file: 'public/404', status: 404, formats: [html]
  end
end
War es hilfreich?

Lösung

Das wichtigste zuerst. Ansichten beziehen sich auf Aktionen in Controllern. Es kann also mehrere Ansichten für jeden Controller oder sogar für keine geben.

Also, wenn Sie rendern wollen @reviews und @logs Auf derselben Seite sollten Sie zuerst beide Instanzvariablen in derselben Aktion instanziieren und anschließend beide Teilungen in derselben Aktion rendern. Wie machst du das? Einfach. Zuerst sind Sie zu dem Controller gekommen, den Sie gerade gezeigt und bearbeitet haben show Aktion.

def show       
  # You can set the variable in the if-clause 
  # And you also need to use static finders with a hash as an argument in Rails4
  if (@user = User.find_by(name: params[:id]))
     @reviews = @user.reviews.all 
     @logs = @user.logs.all
  # You don't need to call render explicitly 
  # if you render the view with the same name as the action 
   else
     render file: 'public/404', status: 404, formats: [html]
   end     
end

Zweitens: Du gehst zu dir /app/views/reviews/show.html.erb Vorlage und legen Sie beide Teilungen dort wie dieses ein (dies ist nur ein Beispiel, passen Sie Ihr Markup an Ihre Bedürfnisse an).

<h1> Reviews and Logs</h1>
<div id="reviews_part">
 <%= render @reviews %>
</div>
<div id="logs_part">
  <%= render @logs %>
</div>

Erstellen Sie nun 2 neue Partials /app/views/reviews/_review.html.erb und /app/views/logs/_log.html.erb und geben Sie dort alle erforderlichen Markups ein (verwenden Sie reguläre Variablen review und log um die sich wiederholenden Objekte anzuschließen). Rails wiederholt diese Teilungen nach Bedarf automatisch.

Oder Sie können das Teilrender explizit nennen

<div id="reviews_part">
  <% @reviews.each do |review| %>
   <%= render review %> 
        which is the same as
   <%= render partial:"reviews/review", locals:{review:review} %>
  <% end %>
</div>

Andere Tipps

Hier ist der Weg, Teilungen in Haml in Ansichten zu rendern:

=render :partial => "header"
%h2 Hello World
=render :partial => "footer"

Jedes Teil, den Sie auf diese Weise rendern, muss im selben Ordner erstellt werden. Der Name jedes Teils muss mit einem Unterstrich beginnen (_). Dies sollte das Verzeichnis der Ansicht sein:

- home
    - index.html.haml
    - _header.html.haml
    - _footer.html.haml
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top