Rails:从两页创建

时间:2011-01-13 23:15:38

标签: ruby-on-rails

我对Rails很新,所以也许我只是错过了“Rails方式”这样做,但我有一个模型,称之为Post。我可以从规范posts/new页面创建帖子,也可以从其他页面创建帖子,例如home/index

home/index我有一个form_for @post(与posts/new略有不同,但我说可以使用部分)。问题是在PostController.create我无法将新创建的@post对象传递回home/index(如果有错误),因为:

  • 如果我没有指定要呈现的页面,它将自动呈现posts/new
  • 我不知道调用页面是为了将其重定向到正确的调用页面(posts/newhome/index
  • 即使我知道它(攻击请求引用者或使用redirect_to :back),redirect_to也不会传回对象,因此从home/index
  • 调用时@post为空

有任何帮助吗?感谢

修改

也许一个可能的解决方案是从请求中获取调用控制器/操作并将其呈现回来。有什么办法吗?

3 个答案:

答案 0 :(得分:0)

理论上,你可以通过检查引用来实现你想要做的事情:

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

答案 1 :(得分:0)

要获取引荐来源页面,您可以创建一个名为redirect的隐藏字段。您可以在控制器中使用它。

redirect_to params[:redirect] || posts_path

您是否尝试过将查询字符串中的帖子ID传递给home/index

例如:/home/index?post_id=42

答案 2 :(得分:0)

您可以通过查看

找出谁调用了您的信息页
request.referrer

我不知道这是否是“轨道方式”,但这是我的解决方案。

您可以为

添加路线
match home/index/(:id) => "home#index"

并在创建Post后重定向到此。然后在您的Home控制器index操作中执行操作

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

如果@Post存在,您的视图应显示帖子

我喜欢这种方法,因为它将所有逻辑保留在应有的位置。控制器中的路由逻辑和视图中的视图逻辑。