我有一个表单,我试图在使用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”?
答案 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
)没有任何好处,因为它们在重定向期间会丢失。