2013-05-24 4 views
0

Я пытаюсь настроить мою index.html.erb (корневую страницу), чтобы я мог видеть два элемента. Форма «новый пост» и форма «новый пользователь». Я пытаюсь получить кнопку отправки формы для перехода на страницу показа после создания пользователя (или сообщения). Он не работает на корневой странице - он просто меняет URL на «localhost: 3000/#/x», где «x» - это идентификатор пользователя (или сообщения), но страница не изменяется. Однако, когда я перехожу к «localhost: 3000/users», а затем попытаюсь создать пользователя, он изменится, чтобы показать страницу показа пользователей. Это имеет смысл для меня в некотором роде (я не могу сказать, почему ... что-то делать с маршрутизацией и быть «внутри» приложения?). Я просто хочу, чтобы кнопка отправки внесла изменения на страницу показа при использовании с корневой страницы (опять же ... она отлично работает, когда я «внутри» приложения). Я только размещаю код «posts», код «users» идентичен, за исключением того, что появляется «post» или «posts», это будет «пользователь» или «пользователь», соответственно. Вот код:показать страницу показа на submit backbone.js + rails + rails-backbone gem

new_view.js.coffee

Example.Views.Posts ||= {} 

class Example.Views.Posts.NewView extends Backbone.View 
    template: JST["backbone/templates/posts/new"] 

    events: 
    "submit #new-post": "save" 

    constructor: (options) -> 
    super(options) 
    @model = new @collection.model() 

    @model.bind("change:errors",() => 
     this.render() 
    ) 

    save: (e) -> 
    e.preventDefault() 
    e.stopPropagation() 

    @model.unset("errors") 

    @collection.create(@model.toJSON(), 
     success: (post) => 
     @model = post 
     window.location.hash = "/#{@model.id}" 

     error: (post, jqXHR) => 
     @model.set({errors: $.parseJSON(jqXHR.responseText)}) 
    ) 

    render: -> 
    $(@el).html(@template(@model.toJSON())) 

    this.$("form").backboneLink(@model) 

    return this 

Я пытался возиться с функцией «сохранить» - я играл с «window.location.hash». Я также попытался создать метод, называемый «показом» в представлении, и использовал его для «router.navigate», чтобы сделать переключатель. Затем я добавил «this.display()» в функцию «save» (сразу после строки «window.location.hash»). Он изменил URL-адрес на то, что я хотел, чтобы он был ... но все же не переключатель страницы (с корневой страницы).

posts_router.js.coffee

class Example.Routers.PostsRouter extends Backbone.Router 
    initialize: (options) -> 
    @posts = new Example.Collections.PostsCollection() 
    @posts.reset options.posts 

    routes: 
    "new"  : "newPost" 
    "index" : "index" 
    ":id/edit" : "edit" 
    ":id"  : "show" 
    ".*"  : "index" 

    newPost: -> 
    @view = new Example.Views.Posts.NewView(collection: @posts) 
    $("#posts").html(@view.render().el) 

    index: -> 
    @view = new Example.Views.Posts.IndexView(posts: @posts) 
    $("#posts").html(@view.render().el) 

    show: (id) -> 
    post = @posts.get(id) 

    @view = new Example.Views.Posts.ShowView(model: post) 
    $("#posts").html(@view.render().el) 

    edit: (id) -> 
    post = @posts.get(id) 

    @view = new Example.Views.Posts.EditView(model: post) 
    $("#posts").html(@view.render().el) 

post.js.coffee

class Example.Models.Post extends Backbone.Model 
    paramRoot: 'post' 

    defaults: 
    title: null 
    content: null 

class Example.Collections.PostsCollection extends Backbone.Collection 
    model: Example.Models.Post 
    url: '/posts' 

index.html.erb (корневая страница)

<div id="container">Loading...</div> 

<script type="text/javascript"> 
    $(function() { 
    window.newView = new Example.Views.Users.NewView({model: <%= @users.to_json.html_safe -%>,collection: new Example.Collections.UsersCollection()}); 
    window.router = new Example.Routers.UsersRouter({users: <%= @users.to_json.html_safe -%>}); 
    var postView = new Example.Views.Posts.NewView({model: <%= @posts.to_json.html_safe -%>,collection: new Example.Collections.PostsCollection()}); 
    $('body').html(newView.render().$el); 
    $('body').append(postView.render().$el); 
    Backbone.history.start({pushState: true}); 
    }); 
</script> 

ли нужен маршрутизатор сообщений ? У меня создается впечатление, что у вас может быть только один «активный» маршрутизатор.

Заранее спасибо за любую помощь, я буду обращать внимание на сообщение - я отвечу в течение нескольких минут после комментария.

UPDATE

ли example.js.coffee иметь ничего общего с ним?

#= require_self 
#= require_tree ./templates 
#= require_tree ./models 
#= require_tree ./views 
#= require_tree ./routers 

window.Example = 
    Models: {} 
    Collections: {} 
    Routers: {} 
    Views: {} 
+0

У вас есть 'Example.Views.Posts' правильно инициализированный? Я имею в виду, что у вас есть 'Example = {}', 'Example.Views = {}' и 'Example.Views.Posts = {}' – juanpastas

+0

То же самое для ваших других пространств имен – juanpastas

+0

Я не уверен, что я следую ... Я ' m не совсем уверен, что эти строки делают ... – ewizard

ответ

0

Кажется, вы не правильно инициализированы своими пространств имен, вы обычно делаете:

window.Example = 
    Views: {} 
    Models: {} 
    Routers: {} 

И тогда вы могли бы иметь больше пространства имен, в вашем случае, сообщения, в new_view.js.coffee:

Example.Views.Posts ||= {} 

class Example.Views.Posts.NewView ... 

Вы также можете определить более глубокие пространства имен в первом объекте, который я написал:

window.Example = 
    Views: 
    Posts: {} 
    Users: {} 
    Models: {} 
    Routers: {} 

В этом случае вам не придется писать

Example.Views.Posts ||= {} 

По вашему мнению.

Если вы в Rails вы могли бы написать эту инициализацию в манифесте application.js, хотя я читал не рекомендуется писать код там, в случае, если вы выберете для этого, не забудьте включить первый application.js

//= require_self 
//= require_tree ./views 
... 

require_self должен быть первым.

+0

спасибо ... У меня вопрос ... как все это связано с тем, что я хочу, чтобы кнопка отправки отображала представление с корневой страницы? Я понимаю, что я могу делать что-то неправильно ... но как меняет этот материал, помогая мне делать то, что я хочу? – ewizard

+0

Хороший вопрос, у вас должна быть ошибка в вашей консоли, что-то вроде «Невозможно прочитать свойство« бла-бла »неопределенного», скажите, пожалуйста, если нет. Если у вас это есть, это потому, что вы не определили 'Some' перед вызовом' Some.More' – juanpastas

+0

Я не получаю никаких ошибок в консоли, когда я нажимаю кнопку отправки. Он просто показывает, что я отправил запрос POST: «POST http: // localhost: 3000/users \t 201 Создано 111 мсек. Когда я нажимаю отправить еще раз я получаю 'PUT HTTP: // локальный: 3000/пользователей/86 \t 500 Internal Server Error \t \t \t 91ms jquery.js тело = 1 (строка 8527) «NetworkError: 500 Внутренняя ошибка сервера - HTTP: // локальный: 3000/пользователей/86" SyntaxError: JSON.parse: неожиданный характер [Перерыв на этой ошибке] \t возвращение window.JSON.parse (данные); ' – ewizard

Смежные вопросы