2013-06-07 2 views
0

영화 요약을 만드는 RESTful 앱이 있습니다.새 작업에서 Model.all 인스턴스 변수를 정의하는 방법.

내 새 페이지에서 이미 만든 영화의 제목을 볼 수 있기를 원합니다.

내 컨트롤러에서 @movies@movie을 새 작업으로 정의합니다.

def new 
    @movies = Movie.all 
    @movie = Movie.new 
    end 

나의 새로운 관점에서, 나는 처음으로 새로운 액션에 갈 때이 작동 형태

<% @movies.each do |movie| %> 
    <tr> 
    <td><%= movie.name %></td> 
    <td><%= movie.info %></td> 
    </tr> 
<% end %> 
#My form starts here, under the table of movie info 

위 @movies에 대한 데이터가 포함되어 있습니다. 그러나 여기에서 실패한 create으로 리디렉션하면 @movies에 nil이 표시됩니다.

왜 그런가? 리디렉션 된 실패한 제작물에서도 작동하도록 @movies를 어떻게 정의 할 수 있습니까?

+0

'만들기'작업을위한 코드를 게시 할 수 있습니까? – Rebitzele

답변

2

create 작업이 실패한 경우 일반적으로 redirect_to을 사용하여 브라우저가 new 동작으로 되돌아 가야합니다. 대신 저장에 실패하면 render :new으로 전화해야합니다.

당신이 render 다른 작업의 견해는 당신이 (@movies@movie있어 귀하의 경우)가 기대 변수와 해당 뷰를 제공하고 있는지 확인해야합니다

. render :new이 호출되면 new 작업 자체가 실행되고 있지 않습니다.

이 문제를 해결할 수있는 방법 중 하나는 @movies 할당을 before_filter으로 제거하는 것입니다. 이 방법은 :new:create 작업 전에 할당되며 :new 작업보기를 렌더링 할 때마다 사용 가능 여부가 보장됩니다.

class MoviesController < ApplicationController 
    before_filter :prepare_movies, only: [ :new, :create ] 

    def new 
    @movie = Movie.new 
    end 

    def create 
    @movie = Movie.new(params[:movie]) 

    if @movie.save 
     # success; redirect elsewhere 
    else 
     # failure; render the :new action's view 
     render :new 
    end 
    end 

    private 

    def prepare_movies 
     @movies = Movie.all 
    end 
end 
+0

덕분에 @Deefor, 완벽하게 작동합니다. 'new' 액션이'render'와 함께 실행되지 않는다고 설명했습니다. 그럼 어떻게 필터를 사용하지 않고'@ movie'를 알 수 있습니까? 액션을 생성 할 때'@ movie'를 사용하고 있습니까? – umezo

+1

수정하십시오. 일단 폼을': create' 액션으로'POST'에 제출하면 ** :'new' 액션이 가지고있는 일과 무시하고있는 ** 것을 무시합니다. 그': create' 액션에서'@ movie'에 대한 검증을했는데 실패했습니다. 이제 영화의 양식을 다시 보여주고 싶습니다 ('new.html.erb'라는 파일에 있습니다.) '@ movie.errors'에 오류를 포함하기를 원하므로 실패를 리디렉션하는 것이 일반적으로 원하는 작업이 아니기 때문에 대신'render'를 호출하여 템플릿 이름': new'을 지정하면' new.html.erb'. – deefour

+1

또한 언급해야 할 중요한 점은 : 당신이 명시 적으로 레일즈에게': create' 액션에서'render' 호출로 응답하기를 원하는 것입니다 :': new' 액션에서 당신은 말하지 않습니다 Rails는 반응하는 방법을 가정하기 때문에, HTML 응답을 제공하기를 원한다고 가정한다. 요청 이후에 HTML 응답을 제공하기를 원한다고 가정한다. 액션 후에 명명 된 템플릿 파일 인'app/views/movies/new.html.erb'.'render : new'로 명시 적으로': new' 액션을 끝낼 수 있습니다 - 레일스는 당신에게 타이핑을 저장하는 것뿐입니다 – deefour

관련 문제