0

我想简单地保存token从 JSON 请求收到的参数,但我根本无法显示它是否实际保存。我观察到,如果您使用 JSON 参数执行 POST 请求,rails 会将其路由到该create方法。我设置了我的全局变量属性(在本例中为token),但是当它重定向到index.html.erb时,它给了我下面的错误

<h1>
  NoMethodError in
  Inits#show
</h1>

<p>
  Showing <i>/Users/alioral/Desktop/Rails/testApp2/app/views/inits/show.html.erb</i> where line <b>#3</b> raised:
  <pre><code>undefined method `token' for nil:NilClass</code></pre>
</p>

这是我的控制器类;

class InitsController < ApplicationController
  def index
  end
  def show
  end
  def create
      @init=Init.new("token"=>params[:token])
      @init.save
      respond_to do |format|
        format.html { redirect_to @init }
        format.json { render json: @init }
      end
  end
end

以防万一这是我生成的模型(不使用脚手架);

class Init < ActiveRecord::Base
  attr_accessible :token
end

这是我的show.html.erb文件;

<h1>Hello, World</h1>
<b>The token is:</b>
<%= @init.token%>
4

2 回答 2

1

首先,create 不会重定向到索引,它会重定向到新创建的 @init 路径。其次,看起来 show haml 文件包含对 @init.token 的引用(在第 3 行中),并且由于 @init 为 nil,因此您会收到此错误。

于 2012-09-10T21:01:16.897 回答
0

实例变量(以 @ 开头的变量)无法在重定向中存活。对于每个请求,都会使用未@init设置的变量创建一个新的控制器实例。

当您调用render ...它时仍然使用原始的@init,但是当您调用重定向时,客户端会发出一个新的 HTTP 请求,并且在服务器端实例化了新的控制器,然后您的@initin#show操作为零。

更新:所以在你的控制器中,你的 show 方法应该有这样的东西:

def show
  @init = Init.find(params[:id])
end
于 2012-09-10T21:07:33.053 回答