1

フォームを作成できるようにデータモデルオブジェクトを作成する正しい方法は何ですか。オブジェクトを最初に作成したとき、有効な属性データを持つ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がnilを返すことです。raise @cred.inspect@credを作成した直後に呼び出しを行って、そのnilを検証します。ビューに到達すると、form_for(@cred)...@ credは単なるnilオブジェクトであるため、undefined method 'model_name' for NilClass:Class

4

1 に答える 1

1

クレデンシャルがコントローラーに属するのはなぜですか?これはユーザーに属している必要があり、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

意見

inフォルダーに、フォームを作成new.html.erbapp/views/credentials/ます。

<%= form_for @cred do |f| %>
...
<% end %>

ページにリンクするには、ビューで:new.html.erbを作成します。link_to

<%= link_to 'New Credential', new_credential_path %>

ルート

RESTfulルートを使用する場合は、にroutes.rb、持っていないクレデンシャルのリソースを追加します。

resources :credentials
于 2012-11-16T07:01:22.167 に答える