开发者

Rails: create from two pages

开发者 https://www.devze.com 2023-02-04 11:48 出处:网络
I\'m very new to Rails, so maybe I\'m just missing the \"Rails way\" of doing this, but I have a model, call it Post. I can create a post from the canonical posts/new page but also from another page,

I'm very new to Rails, so maybe I'm just missing the "Rails way" of doing this, but I have a model, call it Post. I can create a post from the canonical posts/new page but also from another page, say home/index.

In home/index i have a form_for @post (slightly different from the one in posts/new, but say that i can use a partial). The problem is that in the PostController.create I cannot pass the newly created @post object back to home/index (in case of errors) because:

  • if I don't specify a page to render, it will automatically render posts/new
  • i don't know the calling page in order to redirect it to the right calling page (posts/new or home/index)
  • even if i knew it (hacking the request referrer or using redirect_to :back), redirect_to doesn't pass objects back, so that @post is empty when called f开发者_如何学运维rom home/index

Any help? thanks

EDIT

Maybe a possible solution would be to get the calling controller / action from the request and render it back. Any way to do this?


In theory, you could achieve what you're trying to do by checking the referer:

def create
  @post = Post.new

  if @post.update_attributes(params[:post])
    # redirect as appropriate
  else
    render :action => case request.referer
      when new_post_path then "posts/new"
      when "/" then "home/index" # assuming that home/index is the root of the site
    end
  end
end


To get the referrer page, you can make a hidden field with the name redirect. You can use it in the controller.

redirect_to params[:redirect] || posts_path

Have you tried that you pass the post's id in the query string to the home/index

eg: /home/index?post_id=42


You can find out who called your page by looking at

request.referrer

I don't know if this is the "rails way" but here's my solution.

You can add a route for

match home/index/(:id) => "home#index"

and redirect to this after creating the Post. Then in your Home controllers index action just do a

@Post = Post.find(params[:index]) if params[:index]

Your view should display the post if @Post exists

I like this approach because it keeps all the logic where it should be. Routing logic in the controller and view logic in the views.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号