Rails:无法将JSON请求保存为参数

时间:2012-09-10 20:55:45

标签: ruby-on-rails json url-routing

我想简单地保存我从JSON请求中收到的token参数,但我无法显示它是否实际保存。我观察到,如果您使用JSON参数执行POST请求,则会将其路由到create方法。我设置了我的全局变量属性(在本例中为标记),但是当它重定向到 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%>

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

当您拨打render ...时,它仍然使用原始的@init,但是当您调用重定向时,客户端会发出新的HTTP请求,而在服务器端则会有新的控制器实例化并且您的@init处于那时#show动作是零。

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

def show
  @init = Init.find(params[:id])
end