1

ActiveRecordで検証を機能させるためのドキュメントを調べてきましたActiveModel。何らかの理由で、検証結果が返されません。

ActiveRecordRailsの背後にあるカスタムAPIを介してインターフェースするのではなく、インターフェースする一連のモデルがあります。

モデル:

class ApiObject < ApiConnector
  include ActiveModel::Validations
  attr_accessor :fieldName

  validates :fieldName, :presence => true
  def save
    #save method implementation
  end
end

コントローラー:

def create
  @apiObject = ApiObject.new(params[:api_object])

  respond_to do |format|
    if @apiObject.save
      format.html { redirect_to(@apiObject, :notice => 'User was successfully created.') }
      format.xml  { render :xml => @apiObject, :status => :created, :location => @apiObject }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @apiObject.errors, :status => :unprocessable_entity }
    end
  end
end

フォーム:

<%= form_for :api_object, :url => '/apiobjectcontroller/' do |f| %>
    <%= f.label :fieldName, 'Field Name' %>
    <%= f.text_field :fieldName %>
    <%= f.submit 'Create'%>
<% end %>

私はここにレイアウトされたコードに従っています:RailsActiveModel検証

@ apiObject.saveがfalseとして返されるため、メソッドは正しくフォームに戻りますが、検証応答は返されません。マークアップを確認しましたが、通常のRails検証結果が返されません。私は何が欠けていますか?

4

2 に答える 2

5

動作する同様のコードがありますが、クラスにinitializeメソッドがあります。おそらく、モデルは次のようになります。

class ApiObject < ApiConnector
  include ActiveModel::Validations

  validates :fieldName, :presence => true

  attr_accessor :fieldName

  def initialize(fieldName)
    @first_name = fieldName
  end

  def save
    return false unless valid?
    # save method implementation to go here
    # ...
    true # if save successful, otherwise, false
  end
end

上記が機能し、初期化子で割り当てる属性がたくさんある場合は、次の古いトリックを使用できます。

def initialize(attributes = {})
  attributes.each do |name, value|
    instance_variable_set "@#{name}", value
  end
end

編集:有効への呼び出しを追加しましたか?保存の実装では、エラー収集が入力されます。

于 2011-02-04T19:37:45.987 に答える
2

これは完全に答えるはずです:

http://asciicasts.com/episodes/211-validations-in-rails-3

簡単に言うと、インスタンス変数を使用してフォームを作成し、エラーを表示するために必要なコードを追加します。

于 2011-02-04T19:33:40.847 に答える