param以Rails形式传递为nil

时间:2010-09-02 21:25:38

标签: ruby-on-rails mongodb

我有一个表单,我试图在使用MongoDB的rails上进行非常简单的CRUD操作。

我有我的控制器

class RecipesController < ApplicationController   
  def new
    @recipe = Recipe.new
  end

  def update
  end

  def create
    recipe = Recipe.create(params[:title])
    redirect_to params[:title]
    @recipes = Recipe.all
  end

  def index 
    @recipes = Recipe.all
  end
end

我的表格

<%= form_for Recipe.new do |f| -%>

<%= f.text_field :title %>

<%= f.submit "Create Recipe" %>

<% end %>

对我来说似乎很基本。 但是,params似乎没有通过控制器。

我可以看到params通过webrick

Started POST "/recipes" for 127.0.0.1 at 2010-09-02 14:15:56 -0800
  Processing by RecipesController#create as HTML
  Parameters: {"authenticity_token"=>"8oyq+sQCAEp9Pv864UHDoL3TTU5SdOXQ6hDHU3cIlM
Y=", "recipe"=>{"title"=>"test"}, "commit"=>"Create Recipe"}
Rendered recipes/create.html.erb within layouts/application (4.0ms)
Completed 200 OK in 51ms (Views: 16.0ms)

但是redirect_to params [:title]返回一个nil值错误。

我注意到'title'在'recipe'参数中,并且不确定这是否可能是问题的一部分。

让我感到困惑的很多事情之一就是我从来没有真正打电话给创造?是对的吗?我在表单上调用“new”,由于某种原因,rails会自动调用“create”?

2 个答案:

答案 0 :(得分:1)

尝试在@recipes = Recipe.all之后将重定向放入控制器中,并将变量和实例变量设置为:

def create
  @recipe = Recipe.new(params[:title])
  @recipes = Recipe.all
  respond_to do |format|
    if @recipe.save
      format.html redirect_to params[:title]
    end
  end
end

你的语法相当难看。我建议使用开箱即用的Rails生成器来支撑你的工作,并将你的项目基于你的工作,直到你擅长你的工作。

Rails 2:

script/generate scaffold Recipe name:string ingredients:text

Rails 3:

rails g scaffold Recipe name:string ingredients:text

然后确保rake db:migrate

答案 1 :(得分:0)

正如您所建议的,title参数位于recipe参数集中。因此,要创建您的食谱,您需要这样做:

Recipe.create(params[:recipe])

NB。如果配方上的验证失败,这将返回false并且不会创建配方 - 例如如果你需要标题。你没有检查这个,你可能想要。

所以,同样地,如果你想重新定位新食谱的标题(我不知道为什么你想要,因为那可能不是一个有效的位置,但我会按照你的例子),你需要做的事:

redirect_to params[:recipe][:title]

或者您可以访问新创建的食谱r.title上的标题。

此外,如果您要重定向到另一个操作,设置实例变量(@recipes)没有任何好处,因为它们在重定向期间会丢失。