ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Anzeigen verschachtelter REssourcen
BeitragVerfasst: 06 Mai 2013, 13:03 
Offline
Geselle

Registriert: 18 Dez 2012, 19:44
Beiträge: 140
Meinem Buch nach sollte dies eine recht triviale Aufgabe sein, doch irgendwo hapert es bei mir.
Zwei Fragen hätte ich:

1.
Ich habe die Ressource "reviews" in "games" verschachtelt



1
2
3
4
5
6
  resources :games do
member do
get :followers
end
resources :reviews
end


und möchte "reviews#show" aufrufen mit dem Link




<span> <%= link_to "zum Review", game_review_path(@game, @review) %> </span>

doch da erhalte ich nur einen Routing Error, auf der Seite in der der Link gesetzt ist.
Wenn ich als LInk Methode die Form "url_for([@game, @review])" wähle, kann die Seite, wo der Link steht zwar gerendert werden, doch über den Link gelange ich nur erneut auf dieselbe Seite, von der aus ich den Link aufgerufen habe.

Die Beziehungen in meinen models müssen passen und die show methode im review controller unterscheidet sich ja auch nicht von den show methoden nicht verschachtelter resourcen. Was kann da noch fehlen?

2.
Müsste eine komplette Ressource in der routes.rb nicht automatisch auch die Helfer-Methoden zur Verfügung stellen, die ich sonst über den as-Operator definieren müsste?
Jedenfalls ist die Methode "review_path" (die in meinem reivew partial angewandt wird) unbekannt, ehe ich nicht explizit nochmal in der routes.rb eine Zeile wie



get "games/:game_id/reviews/:id" => "reviews#show", as: "review"
definiere.

Doch müsste die review_path Helper Methode nicht eben schon in der (verschachtelten) Ressource vorhanden sein?
im Partial anstelle von "review" die methode "game_review" zu Verwenden hilft da nicht :/


Nach oben
 Profil  
 
BeitragVerfasst: 24 Mai 2013, 17:50 
Offline
Geselle

Registriert: 18 Dez 2012, 19:44
Beiträge: 140
Also das erste Problem konnte ich lösen

Ich weiß nicht warum, aber mit





<span> <%= link_to "zum Review", game_review_path(@game, review) %> </span>


(also nur eine Instanzvariable, statt zwei) Funktioniert der Link zu reviews#show wunderbar.

Es ist aber seltsam, weil in allen dokumentationen zu verschachtelten Ressourcen einheitlich zwei Instanzvariablen verwendet werden :/

Was mich aber auch interessiern würde.
Zwar wird die Review URL (z.B localhost:3000/games/1/reviews/2) mit der richtigen Game_id geöffnet, doch im nachhinein lässt sich über das Browser-Url fenster die id beliebig verändern, ohne dass sich der inhalt ändert. games/999/reviews/2 öffnet mir denselben Inhalt wie games/2/reviews/2...am Ende ist nur die id des Reviews wichtig, die unterschiedlichen Inhalt anzeigt. Was steckt dahinter?


Nach oben
 Profil  
 
BeitragVerfasst: 24 Mai 2013, 21:53 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
Zitat:
Es ist aber seltsam, weil in allen dokumentationen zu verschachtelten Ressourcen einheitlich zwei Instanzvariablen verwendet werden :/
Du hast das Konzept nicht verstanden. Instanzvariablen haben nichts mit Rails zu tun — sie sind elementarer Bestandteil von Ruby und was sie besonders macht ist allein ihr Gültigkeitsbereich. Deswegen hier einmal völlig losgelöst eine kurze Erklärung zu Rubys Variablen:

Lokale Variablen

Lokale Variablen sind der Normalfall. Sie sind gültig innerhalb des kleinsten umschließenden Blocks und tragen keine besonderen syntaktischen Kennzeichnungen. Die Verwendung einer nicht gesetzten lokalen Variable führt in den meisten Fällen zu einem NameError[1].



1
2
3
4
5
6
7
 # Diese Variable ist im Toplevel-Bereich der Datei g��ltig.
ary = [1, 2, 3]

ary.each do |el| # el ist nur g��ltig innerhalb dieses Blocks.
meine_var = "xxx" # Auch diese Variable ist nur innerhalb dieses Blocks g��ltig.
p [el, meine_var]
end


Instanzvariablen

Instanzvariablen spielen erst dann eine Rolle, wenn du anfängst, objektorientiert zu programmieren. Sie sind gültig innerhalb eines bestimmten Objekts und beginnen mit einem @. Sie sind ungesetzt automatisch nil.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Auto

def initialize(farbe)
# `farbe' ist nur lokal in dieser Methode g��ltig. `@farbe' hingegen
# ist eine Instanzvariable und somit ��berall innerhalb einer bestimmten
# Instanz (= Objekt) der Klasse `Auto' g��ltig.
@farbe = farbe
end

def wie_ist_die_farbe?
# Und weil `@farbe' innerhalb eines Objekts g��ltig ist, kann ich auch
# nach dem abgeschlossenen Aufruf von initialize hier auf sie zugreifen.
puts "Die Farbe ist #@farbe."
end

end

ferrari = Auto.new(:rot)
ferrari.wie_ist_die_farbe? #=> Die Farbe ist rot.


Klassenvariablen

Seien hier nur der Vollständigkeit halber erwähnt und beginnen mit @@. Lass die Finger davon.

Globale Variablen

Globale Variablen sind immer und überall in einem Programm verfügbar. Sie beginnen mit $ und sollten nur sehr sparsam eingesetzt werden, da man sich leicht bei der Reihenfolge der Zuweisungen und Zugriffe verzettelt und auch noch weitere Probleme wie Race Conditions oder Speichernutzung hinzukommen. Keinesfalls sind sie eine Abkürzung von Problemen mit Gültigkeitsbereichen! Auch sie geben bei Abruf ohne vorheriges Setzen ein nil zurück.



1
2
3
4
5
6
7
def setzen
$meine_var = :wert
end

p $meine_var #=> nil
setzen
p $meine_var #=> :wert


Und Rails?

Ohne mir den Quellcode angeschaut zu haben, wird es wohl so sein (verzeiht mir, ihr Rails-Gurus, wenn das folgende falsch sein sollte), dass Rails die bei Ankunft eines Requests die jeweilige Controller-Klasse instanziiert und anschließend die View im Kontext der neu geschaffenen Instanz ausführt (es ist in Ruby mithilfe der Methode #instance_eval möglich, in einen anderen Kontext (Binding) zu wechseln und somit Zugriff auf die dort gültigen Variablen zu erhalten). Daher kannst du, wenn du in deiner Controller-Methode eine Instanzvariable setzt, in der View auf diese zugreifen — nicht jedoch auf lokale Variablen, die du dort setzt. Versuche, zu verstehen, warum!
Deine Probleme hängen nicht mit Rails zusammen, sondern einzig und allein mit dem Verständnis der Gültigkeitsbereiche von Variablen. Mach mal die IRB auf und schreib ein paar Klassen und experimentiere mit dem Variablentypen. Wenn ich dir nun noch sage, dass die Argumenttypen der Routing-Helper-Methoden in die Routenfindung mit einfließen und nil dabei unter den Tisch fällt, kannst du dann erklären, wie dein Routingfehler zustande kommt?

Vale,
Quintus

[1] Es gibt da diese nette Konstruktion mit dem angehängten if/unless, mit der man das umgehen kann.

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 25 Mai 2013, 14:27 
Offline
Geselle

Registriert: 18 Dez 2012, 19:44
Beiträge: 140
Also das mit dem Gültigkeitsbereich der Variablen weiß ich jaschon, das Thema wurde an anderer Stelle neulich erst hier im Forum angesprochen.

Meine Frage ist ja, warum als zweiter Eingabeparameter entgegen der Dokumentation eine "lokale" Variable verwendet wird.
Warum bringt mich game_review_path(@game, @review) zur show-view von game (als hätte ich nur game_path(@game) verwendet) und game_review_path(@game, review) zur show-view das reivews (wie beabsichtigt).
"@review" ist ja letztlich auch eine Variable, die im Controller definiert wurde, wieso aber funktioniert das nur mit "review"?


Nach oben
 Profil  
 
BeitragVerfasst: 25 Mai 2013, 15:53 
Offline
Metaprogrammierer

Registriert: 20 Nov 2011, 21:51
Beiträge: 693
Ich hab mich mal durch deinen Code gewühlt…

Du hast folgendes:

https://github.com/SirJaySaeba/Bachelorarbeit_GSO_Sergej_Bjakow_2110631/blob/3350fae739507726ed1d4fb6a032f1d3ba5086b5/Videospiel_Datenbank/app/views/reviews/_review_area.html.erb:


<%= render partial: 'reviews/review', collection: @reviews %>

Das führt dazu, dass dir in dem Partial der jeweils passende Review als lokale Variable "review" zur Verfügung gestellt wird. Nachzulesen unter Ruby on Rails Guides: Layouts and Rendering in Rails, 3.4.5 Rendering Collections.

Deswegen musst du also den Review aus der lokalen Variable holen, das Spiel dagegen erhälst du aus der Instanzvariable des Views.

Und warum die game_id keine Rolle spielt wenn du die URL einfach änderst, erkennst du vielleicht salbst bei einem Blick in deinen Eigenen Code:


1
2
3
4
5
class ReviewsController < ApplicationController 
def show
@review = Review.find(params[:id])
end
end

_________________
Ubuntu Gnome 14.04 LTS
rvm mit App-spezifischer Ruby-Version (meist 2.2.x) und -Gemset

Github ProfilBitbucket Profil


Nach oben
 Profil  
 
BeitragVerfasst: 25 Mai 2013, 18:45 
Offline
Geselle

Registriert: 18 Dez 2012, 19:44
Beiträge: 140
Danke für den Hinweis!

Die Review URL habe ich mal angepasst mit




@review = Review.find_by_game_id_and_id(params[:game_id], params[:id])


und nun sind alle IDs einem bestimmten Content zugewiesen.

Ich hätte da noch eine Verständnisfrage, das noch zum Thema passt.

Ich habe festgestellt, dass ich für mein review Formular nicht zwingend ein hidden_field_tag brauche um intern die game.id zu übergeben. Mein formular für ratings dagegeben kommt ohne den hidden_field_tag (wo game.id übergeben wird) nicht aus. Auf Stackoverflow meinte jemand, dass hidden_field_tags nur dann genutzt werden muss, wenn man auf ein "fremds" Objekt zugreift, das also nicht zur aktuellen ressource gehört.

Da Reviews quasi in Games verschachtelt sind in den routes, sei das hidden_field_tag nicht nötig. Habe ich das so richtig verstanden?


Nach oben
 Profil  
 
BeitragVerfasst: 25 Mai 2013, 20:18 
Offline
Metaprogrammierer

Registriert: 20 Nov 2011, 21:51
Beiträge: 693
Bitte mach für diese Frage einen neuen Thread auf und geb uns dort etwas Beispielcode, ich habe gerade keine Lust mich wieder durch dein Repo zu wühlen.

Am besten du zeigst entweder ein minimales Beispiel mit gekürzten Controllern und Views/Partials oder/und verlinkst die passenden Dateien aus deinem Repo.

_________________
Ubuntu Gnome 14.04 LTS
rvm mit App-spezifischer Ruby-Version (meist 2.2.x) und -Gemset

Github ProfilBitbucket Profil


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron