我想简单地保存我从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%>
答案 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