【问题标题】:How to specify that redirect link uses post method? [duplicate]如何指定重定向链接使用 post 方法? [复制]
【发布时间】:2015-08-13 15:50:19
【问题描述】:

在一个视图中,我有以下格式的链接:

<%= link_to "User", move_on_path(organization: organization, url: edit_profile_path(@user)) %>

这使用一个控制器方法,该方法首先调用一个设置session值的方法,然后移动到指定的url

def move_on
  @organization = Organization.find_by(params[:organization])
  set_session(@organization)
  redirect_to params[:url]
end

这可行,但现在我有一个url,其方法是post,而不是get。当它是post 方法时,我不知道链接的语法。所以我有下面的语法,但需要postedit_profile_path。我如何在下面的语法中指定它(或者没有办法为此更改 def move_on)?

<%= link_to "User", move_on_path(organization: organization, url: edit_profile_path(@user)) %>

更新:使用下面的@Chuck Callebs 答案,我已将控制器方法更改为:

def move_on
  @organization = Organization.find_by(params[:organization])
  set_session(@organization)
  if params[:_url] == 'users#edit'
    post_to params[:url]
  else
    redirect_to params[:url]
end

这是正确的吗?我编造了post_to 来解释我想要它做什么,但是将它发布到url 的正确代码是什么?

我不认为这是一个重复的帖子,因为它更多的是在这个用例中寻找解决方案,而不是关于 post 请求是否可能。

【问题讨论】:

  • 你为什么首先使用 POST?
  • 对于上面编辑用户配置文件的示例,它确实没有意义,但我也有链接,例如删除用户在组织中的角色。那就是我使用发布请求的地方。

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

不幸的是,我认为没有办法将 redirect_to 与 POST 一起使用。

这是因为 redirect_to 只是将 HTTP 30x 重定向标头发送到浏览器。然后浏览器在目标 URL 上发起一个 GET 请求。在我看来,您有两个选择:

  • 为这个特定的重定向创建一个新的控制器方法(一个 GET 请求,它将执行类似的任务)

  • 您可以在现有控制器方法中使用request.get? 方法来处理两个请求之间的任何差异。

更新

我认为您应该将 POST 请求中的功能包装到服务对象中,然后直接在 move_on 方法中调用它。这就是我要走的路线。话虽如此,如果您需要执行上述方法,请参阅此 StackOverflow 答案:

https://stackoverflow.com/a/10614765/14877

如果你最终走上了这条路,你应该编写一个帮助方法(甚至可以称之为post_to :))来为你处理细节。

【讨论】:

  • 感谢@Chuck,我已根据您的建议添加了对原始帖子的更新。你能看一下吗?
  • @Nick 更新了我的答案。
【解决方案2】:

遵循link_to 文档http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to

我认为您只需要添加method 选项:

<%= link_to "User", move_on_path(organization: organization, url: edit_profile_path(organization.id), method: :post) %>

【讨论】:

  • 这会导致原始点击通过 POST 请求发送到 move_on_path,我相信 OP 要求的是重定向是通过 POST 发送的,正如 Chuck 指出的那样,这是不可能的。跨度>
  • 你是对的@TomWalpole。现在我明白他需要什么了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 2013-10-04
  • 2018-07-23
  • 2017-09-30
  • 1970-01-01
相关资源
最近更新 更多