2014-09-10 1 views
1

나는 Rails와 ember.js (ember-rails gem을 통해)로 기본적인 reddit clone app를 만들고있다. 기본적으로 필자는 제대로 작동하는 레일스의 '포스트'모델/컨트롤러를 가지고 있지만 레일스 유효성 검사가 실패하더라도 엠버 포스트 모델의 액션을 생성 할 때 새 포스트를 추가 할 때 '포스트'인덱스 페이지로 이동하면 모든 게시물을 나열, 나는 그것을 볼 수 있습니다 (즉, ember 데이터를 지키고있다). 내가 그것을 새로 고칠 때,하지만 내가 백엔드에서 거부되면 삭제되도록 그 데이터를 제거하는 가장 좋은 방법은 궁금하네요? 또 다른 이상한 점은 단순히 posts/new 페이지로 이동하면 새로운 빈 게시물이 만들어지고 그 다음에 클라이언트 측에서 app/assets/javascripts/routes에 다음 파일이있는 것입니다.ember.js frontend에서 새 레코드를 지우는 방법 레일 검증 (422 오류)?

posts_route.js :

RedditJp.PostsRoute = Ember.Route.extend({ 

    model: function() { 
     return this.get('store').find('post'); 
    } 
}); 

posts_new_route.js :

RedditJp.PostsNewRoute = Ember.Route.extend({ 

    model: function(){ 
    return this.get('store').createRecord('post'); }, 

    actions: { 
    create: function() { 
     var newPost = this.get('currentModel'); 
     var self = this; 
     newPost.save().then(
     function() { self.transitionTo('posts'); }, 
     function() { } 
     ); 
    } 
    } 
}); 

여기에 내가 에 데이터를 전송하는 데 사용할 노력하고있어 양식의 게시물/new.hbs : 여기

<h1>Posts</h1> 
<ul> 
    {{#each}} 
     <li>{{title}} at {{address}} vote count: {{voteCount}}</li> 
    {{else}} 
     <li>There are no posts.</li> 
    {{/each}} 
</ul> 

router.js입니다 : 자산/자바 스크립트/템플릿/글에서 다음

<h1> Add a post </h1> 
{{#each error in errors.title}} 
    <p>{{error.message}}</p> 
{{/each}} 

<form {{action "create" on="submit"}}> 
    <div> 
    <label> 
     Title<br/> 
     {{input type="text" value=title}} 
    </label> 
    </div> 
    <div> 
    <label> 
     Address<br/> 
     {{input type="text" value=address}} 
    </label> 
    </div> 
    <div> 
    <label> 
     Vote count<br/> 
     {{input type="text" value=voteCount}} 
    </label> 
    </div> 
    <button>Save</button> 
</form> 

및/I는 index.hbs이

RedditJp.Router.map(function() { 
    this.resource('posts', function() { 
    this.route('new') 
    }); 

    this.resource('home', function() { 
    }); 

}); 

RedditJp.IndexRoute = Ember.Route.extend({ 
    redirect: function(){ 
    this.transitionTo('home') 
    } 
    }); 

나는 posts/index.hbs 파일에 체크를 추가하고 더러운,하지만 더 깨끗한 방법이 있어야합니다, 그래서이 사건에서 모범 사례로 간주됩니다 궁금하네요 (나는 posts_new_route.js에 약속에 추가 할 수있는 몇 가지 코드가 있어야한다고 생각하고 있어요 이것을 처리하기 위해, 그러나 나는 그것을 정말로 이해할 수 없다).

고맙습니다. 추가 정보가 필요하면 알려주세요.

답변

0

당신은 새로운 기록을 숨길 수있는 템플릿 모델 isNew 경우 확인할 수 있습니다 템플릿에서

var record = store.createRecord('model'); 
record.get('isNew'); // true 

record.save().then(function(model) { 
    model.get('isNew'); // false 
}); 

가 답장을 {{each model}} {{#if model.get('isNew')}}

record.save().then(function(){ // Success callback }, function() { model..deleteRecord(); });

+0

감사처럼 보일 것이다 (또한 당신은 IsEmpty 함수 속성을 사용할 수 있습니다)! 일반적으로이 문제를 해결하는 가장 좋은 방법으로 간주됩니까? 레일즈 인증이 실패하자마자 레코드를 자동으로 삭제할 수 있는지 궁금합니다. 상황이 지금은 잘못된 레코드가 여전히 클라이언트에 쌓일 수 있으므로 데이터를 지우는 더 깨끗한 방법이 있는지 궁금합니다. – etdev

+0

많은 코너 케이스가 있기 때문에 이것이 최선의 방법이라고 생각합니다. 레코드를 크레이트 할 때 언제 어디서 언제 삭제 또는 저장해야하는지 정의해야합니다. 성공하면 페이지 또는 다른 오류로 전환합니다. 오류 개체를 전달하고 백엔드에서 오류 메시지를 표시 한 다음 저장소 개체를 삭제할 수 있습니다. http://emberjs.com/api/data/classes/DS.Errors.html을 확인하십시오. – Stakoov