【问题标题】:How to avoid model's data being changed by redirect如何避免模型的数据被重定向改变
【发布时间】:2018-01-17 13:23:09
【问题描述】:

我的home_controller.rb 看起来像这样:

class HomeController < ApplicationController
  def index
    @post_a = Post.where(title: 'a').sample
    @post_b = Post.where(title: 'b').sample
  end

index.html.erb是这样的:

<div>
   <%= @post_a.title %>
   <%= @post_b.title %>
</div>

页面刷新时,@post_a.title@post_b.title发生变化。

有没有办法防止数据被刷新或重定向改变?

【问题讨论】:

  • 你正在使用sample 获取随机记录,除了什么。

标签: ruby-on-rails ruby stateless


【解决方案1】:

变量保存您分配给它们的值。当您获取随机记录(使用sample)时,查询的结果是从数据库中获取的随机记录,因此这两个变量的值有点随机

如果您希望将可预测的记录分配给@post_a@post_b,则需要更新查询以获取所需的记录。

例如,按 ID 获取:

@post_a = Post.find(1)

【讨论】:

  • 假设你在“它们没有改变”中的“[t]hey”是@post_a@post_b,它们确实在请求(包括重定向)之间发生变化,这与什么相反你写了。这就是这个问题的重点。这个答案显然是错误的。
  • 是的,我指的是变量。我实际上并不清楚响应,我的意思是记录的内容没有改变,改变的是分配给变量的值作为随机记录被获取。
【解决方案2】:

它是 RESTful 的基本属性,因此是无状态系统,如 Rails 创建的系统,对请求的响应不能直接访问另一个响应中所做的事情。除了响应之外要访问的所有内容都必须保存在某个地方,通常是数据库。

为了从第二个响应中访问您在第一个响应中设置的变量的值,标准方法是将信息保存在session 中。你或许可以阅读this

鉴于您正在使用重定向,另一种方法是在调用重定向时将值作为参数传递给路径辅助方法。而不是这样做:

redirect_to foo_bar_path

你可以这样做:

redirect_to foo_bar_path(post_a_id: @post_a.id, post_b_id: @post_b.id)

然后在重定向目的地的控制器动作中,您可以访问@post_apost_b的id为params[:post_a_id]params[:post_b_id]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多