안녕 얘들 아, 네 도움이 필요해. Ruby on Rails tutorial의 10 장에서 작성자는 2 개의 컨트롤러를 한 번에 볼 수 있습니다. 나는 두 번째 컨트롤러에 속한 메서드를 렌더링 할 때 첫 번째 컨트롤러에서 두 개의 컨트롤러가있는 비슷한 응용 프로그램을 빌드합니다. 첫 번째 컨트롤러의 문제는 params에 문제가 있습니다. (자습서에서는 작성자가 다른 컨트롤러의 동작에 매개 변수를 사용하지 않습니다.)하나의보기에서 여러 컨트롤러 (레일 MVC에서 루비)
특히 2 개의 컨트롤러가 있습니다 : UsersController 및 MicropostsController. 또한 사용자의 show.html.haml 페이지에서 두 개의 컨트롤러를 사용합니다. 사용자의 마이크로 포스트를 표시하는 UsersController와 사용자가 새로운 마이크로 포스트를 만들 수 있도록 MicropostsController를 사용합니다.
내부 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
내부 UsersController 응용 프로그램/뷰/사용자/show.html.haml에서
def show
@user = User.find(params[:id])
@microposts = @user.microposts.paginate(page: params[:page])
@micropost = current_user.microposts.build if signed_in?
end
- 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
다음과 같이
그래서 기본적으로 내 질문에 요약 :
1) 하나의보기에 여러 개의 컨트롤러가있는 것이 좋습니다. 나는 그물에서 모순되는 대답을 발견했다. (실제로이 코드가 RESTful인지 확실하지 않은 경우)
2) 1이 예 (또는 적어도 나쁜 습관은 아닙니다) 인 경우 더 효율적인 방법으로 같은 것을 구현할 수 있습니까? 내가 보는 방식 때문에 다른 컨트롤러에서 동작을 렌더링 할 때마다 변수를 다시 정의해야합니다.
3) 나는이 방법을 사용하는 것을 제안하는 stackoverflow에서 similar 주제를 발견했다. (정확히 내가 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
내가 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
나는 브라우저에서 완전히 아무 것도 얻을 수 없습니다. 또한 사용자/1 페이지를 보려고하면 다음과 같은 오류가 발생합니다 (!!) :
undefined method `[]' for nil:NilClass
어떤 도움도 정말 유용 할 것입니다! 다른 정보가 필요하면 알려주십시오!