Как перенаправить с нового поста URL на шоу пост URL в Буффало - PullRequest
0 голосов
/ 08 марта 2019

Я создаю блог-сайт в Буффало, и у меня возникла небольшая проблема. У меня есть следующие маршруты в app.go:

b := BlogsResource{}
blogGroup := app.Group("/blog")
blogGroup.GET("/", b.List)
blogGroup.GET("/new", b.New)
blogGroup.GET("/post/{slug}", b.Show)
blogGroup.GET("/post/{slug}/edit", b.Edit)
blogGroup.POST("/", b.Create)
blogGroup.PUT("/post/{slug}", b.Update)
blogGroup.DELETE("/post/{slug}", b.Destroy)
blogGroup.Middleware.Skip(Authorize, b.List, b.Show)

И мой blogs.go метод создания ресурса выглядит так:

func (v BlogsResource) Create(c buffalo.Context) error {
    // Allocate an empty Blog
    blog := &models.Blog{}

    // Bind blog to the html form elements
    if err := c.Bind(blog); err != nil {
        return errors.WithStack(err)
    }

    // Get the DB connection from the context and validate it
    tx := c.Value("tx").(*pop.Connection)
    verrs, err := blog.Create(tx)

    if err != nil {
        return errors.WithStack(err)
    }

    if verrs.HasAny() {
        // Make the errors available inside the html template
        c.Set("errors", verrs)

        // Render again the new.html template that the user can
        // correct the input.
        return c.Render(422, r.Auto(c, blog))
    }

    // If there are no errors set a success message
    c.Flash().Add("success", T.Translate(c, "blog.created.success"))
    // and redirect to the blogs index page
    return c.Redirect(302, "blogPostPath()", render.Data{"slug": blog.Slug})
}

new.html выглядит так:

<div class="page-header">
<h1>New Blog</h1>
</div>

<%= form_for(blog, {action: blogPath(), method: "POST"}) { %>
<%= partial("blogs/form.html") %>
<a href="<%= blogPath() %>" class="btn btn-warning" data-confirm="Are you sure?">Cancel</a>
<% } %>

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь выполнить перенаправление, он указывает на правильный URL localhost:3000/blog/post/my-blog-post-here, но тело пытается использовать шаблон blogs/index.html вместо blogs/show.html. Итак, что мне нужно сделать, чтобы точка перенаправления указывала на правильный URL и содержала правильное тело? Я попытался установить <%= form_for(blog, {action: blogPath(), method: "POST"}) { %> на <%= form_for(blog, {action: blogPostPath(), method: "POST"}) { %> в new.html, но я получаю сообщение об ошибке, когда мне нужен слаг при переходе на localhost:3000/blog/new.

1 Ответ

0 голосов
/ 14 марта 2019

Это похоже на проблему маршрутизации.Я наткнулся на этот вопрос.Это было связано с порядком маршрутов делкарации.Маршрутизатор чувствителен к порядку;он будет перенаправлен к первому подходящему объявлению ... Может быть, в вашем случае первым подходящим маршрутом будет "/", я не уверен на 100%, но попробуйте другой способ, например:

blogGroup.GET ("/ post / {slug}", b.Show)

blogGroup.GET ("/ post / {slug} / edit", b.Edit)

blogGroup.GET ("/", b.List) blogGroup.GET (" / new ", b.New)

...