创建数据模型对象以便创建表单的正确方法是什么。当我第一次创建对象时,它没有带有效属性数据的params数据,因此build_返回一个无效对象,rails抛出500内部服务器错误。
我看到的是:
型号
class Credentials < ActiveRecord::Base
belongs_to user
...
class User < Active ::Base
has_one :credentials, :dependent => :destroy
...
控制器
def new
@cred = current_user.build_credentials
render 'edit'
end
...
查看
<%= form_for(@cred) do |f| %>
日志
Started GET "/credentials" for 127.0.0.1 at 2012-11-16 00:43:26 -0500
Processing by CredentialsController#new as HTML
[1m[35mUser Load (0.3ms)[0m SELECT `users`.* FROM `users` WHERE `users`.`remember_token` = 'oWGXC2dmcg2sRyg5mvA6fw' LIMIT 1
[1m[36mUser Load (0.3ms)[0m [1mSELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1[0m
[1m[35mCredentials Load (0.4ms)[0m SELECT `credentials`.* FROM `credentials` WHERE `credentials`.`user_id` = 1 LIMIT 1
[1m[36m (0.1ms)[0m [1mBEGIN[0m
[1m[35m (0.1ms)[0m COMMIT
Rendered credentials/edit.html.erb within layouts/application (8.8ms)
Completed 500 Internal Server Error in 100ms
rsec结果
undefined method `credentials_index_path' for #<#<Class:...
凭证模型有许多验证要求,因此new
创建的对象是无效的(我可以在控制台中确认这一点),因为填充的唯一值是外键,在本例中是user_id。但是,在控制台中,我可以建立@credentials变量,并在下一个命令中分配所有属性。在web服务器中,500错误使得不可能遵循相同的方法。
更新为了更清楚地说明这一点,问题是@cred = current_user.build_credentials
正在返回零。在创建@cred之后,我直接放入了一个raise @cred.inspect
调用,以验证它为nil。当我进入视图时,form_for(@cred)...
@cred只是一个nil对象,所以它与undefined method 'model_name' for NilClass:Class
一起呕吐
为什么凭据属于控制器?它应该属于用户,如果你使用has_one
关联,你应该使用凭证的单数名词:
型号
class Credential < ActiveRecord::Base
belongs_to user
...
class User < Active ::Base
has_one :credential, :dependent => :destroy
控制器
在你的控制器中,如果你想为表单创建新对象,你只需要:
def new
@cred = current_user.build_credential
end
def create
@cred = current_user.build_credential(params[:cred])
if @cred.save
# what you do when creating object success
else
# what you do when creating object failed
end
end
查看
在app/views/credentials/
文件夹中的new.html.erb
中,创建表单:
<%= form_for @cred do |f| %>
...
<% end %>
要链接到new.html.erb
页面,请在视图中创建一个link_to
:
<%= link_to 'New Credential', new_credential_path %>
路线
如果你想使用RESTful路由,在你的routes.rb
中,为你没有的凭据添加资源:
resources :credentials