mehrere Steuerungen in einem view (ruby on rails, MVC)
Hey Leute ich brauche Eure wertvolle Hilfe. In der Ruby on Rails tutorial, am 10ten Kapitel, der Autor hat 2 Controller auf einen Blick. Ich Baue eine ähnliche app, in der ich auch 2 Controller auf einen Blick, jedoch, wenn ich die render-Methode, die gehört zur zweiten controller, von den ersten habe ich Probleme mit den params. (im tutorial wird der Autor verwendet keine Parameter in der Aktion des anderen Controllers)
Genauer gesagt habe ich 2 Controller: UsersController und MicropostsController. Auch in der show.html-Code.haml Seite der Nutzer, benutze ich beide Controller: UsersController für das zeigen des Benutzers microposts und MicropostsController, um dem Benutzer zu ermöglichen, erstellen Sie eine neue micropost.
Innen MicropostsController:
def create
@micropost = current_user.microposts.build(params[:micropost])
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to user_path(current_user)
else
#render text: renderActionInOtherController(UsersController,:show, {:id => 1})
@user = User.find(current_user)
@microposts = @user.microposts.paginate(page: params[:page])
render 'users/show'
end
end
Innen UsersController
def show
@user = User.find(params[:id])
@microposts = @user.microposts.paginate(page: params[:page])
@micropost = current_user.microposts.build if signed_in?
end
In der app/views/users/show.html-Code.haml
- provide(:title, @user.name)
.users_page
.row
%aside.span4
- if !signed_in?
%section
%h1
= gravatar_for @user
= @user.name
- else
%section
= render 'shared/user_info'
%section
= render 'shared/micropost_form'
.span8
- if @user.microposts.any?
%h3 Microposts (#{@user.microposts.count})
%ol.microposts
= render @microposts
= will_paginate @microposts
Also im Grunde meine Frage zusammengefasst wie folgt:
1)Ist es eine gute Praxis, haben mehrere Steuerungen in 1-Ansicht? Ich habe festgestellt widersprüchliche Antworten im Netz. (eigentlich bin ich nicht einmal sicher, ob dieser code bleibt RESTful)
2) Wenn 1 ist ja (oder zumindest ist es nicht eine schlechte Praxis) konnte ich umsetzen, die gleiche Sache in einer effizienteren Art und Weise? Weil so wie ich das sehe, jedes mal, wenn ich die render-Aktion von einem anderen controller habe ich neu definieren der Variablen.
3) fand ich einen ähnlich Thema in stackoverflow in die man schlägt, um diese Methode (die ich nicht bekommen, was es genau macht, da ich neu bin im RoR).
def renderActionInOtherController(controller,action,params)
controller.class_eval{
def params=(params); @params = params end
def params; @params end
}
c = controller.new
c.request = @_request
c.response = @_response
c.params = params
c.send(action)
c.response.body
end
Wenn ich diese version des create-Aktion innerhalb MicropostsController,
def create
@micropost = current_user.microposts.build(params[:micropost])
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to user_path(current_user)
else
render text: renderActionInOtherController(UsersController,:show, {:id => 1})
#@user = User.find(current_user)
#@microposts = @user.microposts.paginate(page: params[:page])
#render 'users/show'
end
end
wenn ich den post-button, den ich Total nichts im browser. Außerdem, wenn ich versuche, eine Ansicht tha Benutzer/1 Seite erhalte ich die folgende Fehlermeldung(!!):
undefined method `[]' for nil:NilClass
Jede Hilfe wird wirklich wertvoll! Wenn Sie alle anderen info bitte informieren Sie mich!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Technisch, diese Terminologie ist etwas verwirrend. Standardmäßig ist jede Methode im controller entspricht einer ähnlich benannten Datei anzeigen, so kann es besser sein, das Wort mit der Frage, wie "Ist es gute Praxis für das Rendern einer Ansicht, die nicht die Standard-Ansicht -?" Und die Antwort ist, natürlich, es hängt davon ab. Es ist eine Technik Häufig verwendet, um zu TROCKNEN-controller-code und, wenn es Vorteile gewonnen werden, indem es, in Ihrer Anwendung ist, würde ich sicherlich verwenden. In der Tat, der controller-code, erzeugt durch die Standard-Ressource scaffolding in Rails es verwendet in der
create
undupdate
Methoden. Ich denke, Sie könnten das argument, dass alles, was in Rails core ist, wenn nicht ein best-practice-zumindest innerhalb der Grenzen der Vernunft.Mit diesem wird gesagt, gibt es vielleicht Gelegenheiten für Verbesserung. Ein üblicher Weg, um behandeln Sie die gleiche Sache wäre, um Ihre route zu erstellen und die update-Anfragen, um den gleichen controller handeln und verwenden die gleichen controller-Ansicht. Wenn dies nicht möglich ist, wenigstens sicher sein, dass Sie nicht brauchen, um neu zu definieren die Variablen. Aus der offizielle Dokumentation:
Bonus: Wenn Sie brauchen, irgendwohin zu gehen, dass bereits das laden der Einstellung selbst, und Sie brauchen nicht Zugang zu jedem der im Rahmen von Variablen, eine Umleitung ist wahrscheinlich die bessere Wahl. Auf diese Weise werden Sie nicht brauchen, um re-beschreiben Sie Ihre controller-Logik in mehreren Orten. Hier ist ein Beispiel aus deinem geposteten code:
Möchte ich nur hinzufügen, dass ich glaube, die Rechtfertigung, warum sich die tutorial-Autor implementiert eine weniger TROCKENE Lösung für das Erstellen von Microposts Aktion ist, weil wenn man redirect_to statt render, dann verlieren Sie die flash-Fehler der form.
Ich bin nicht sicher, ob es eine weitere CHEMISCHE Lösung, pflegt form-flash-Fehler.