0

RoR を学習していますが、同じ形式でモデルを検証する方法が見つかりません。検証中ですが、1 つのモデル (アドレス) のエラー メッセージのみが表示され、変更が行われる前と同じように、他のモデルの他の入力フィールドが入力されます。いくつか試してみましたが、どれもうまくいきませんでした。

edit.html.erb で、エラー メッセージを表示しています。これは、1 つのモデルが正しくない場合にのみ正常に機能します。両方のモデルの入力が正しくない場合、アドレスのエラー メッセージのみが表示され、相互関係の入力フィールドは以前の値でリセットされます。

本当に必要なのはこれだけだと思います。アドレス コントローラが空です。検証を除いて、他のすべては正常に機能しています。

マティアス。

Edit.html.erb:

<h1>Edit Mutuality</h1>

<%= form_for @mutuality do |f| %>
<%= fields_for @address do |fa| %>
    <% if @mutuality.errors.any? %>
        <h2>Errors:</h2>
        <ul>
            <% @mutuality.errors.full_messages.each do |msg| %>
                <li><%= msg %></li>
            <% end %>
        </ul>
    <% end %>
    <% if @address.errors.any? %>
        <h2>Errors:</h2>
        <ul>
            <% @address.errors.full_messages.each do |msg| %>
                <li><%= msg %></li>
            <% end %>
        </ul>
    <% end %>
<table>
    <tr>
        <td>
            <%= f.label :name %>
        </td>
        <td>
            <%= f.text_field :name %>
        </td>
    </tr>
    <tr>
        <td>
            <%= f.label :phone %>
        </td>
        <td>
            <%= f.text_field :phone %>
        </td>
    </tr>
    <tr>
        <td>
            <%= f.label :contact %>
        </td>
        <td>
            <%= f.text_field :contact %>
        </td>
    </tr>
    <tr>
        <td>
            <%= fa.label :street %>
        </td>
        <td>
            <%= fa.text_field :street %>
        </td>
    </tr>
    <tr>
        <td>
            <%= fa.label :number %>
        </td>
        <td>
            <%= fa.text_field :number %>
        </td>
    </tr>
    <tr>
        <td>
            <%= fa.label :zipcode %>
        </td>
        <td>
            <%= fa.text_field :zipcode %>
        </td>
    </tr>
    <tr>
        <td>
            <%= fa.label :city %>
        </td>
        <td>
            <%= fa.text_field :city %>
        </td>
    </tr>
    <tr>
        <td>
            &nbsp;
        </td>
        <td>
            <%= f.submit %>
        </td>
    </tr>
</table>
<% end %>

コントローラ:

class MutualitiesController < ApplicationController

def index
    @mutualities = Mutuality.all
  end

  def show
    @mutuality = Mutuality.find(params[:id])
  end

  def new
    @mutuality = Mutuality.new
    @address = Address.new
  end

  def create
    @mutuality = Mutuality.new(params[:mutuality])
    @address = Address.new(params[:address])

    if @address.save
      @mutuality.address_id = @address.id
      if @mutuality.save
        redirect_to mutualities_path, :notice => "Mutuality saved with succes!"
      else
        render "new"
      end
    else
      render "new"
    end    
  end

  def edit
    @mutuality = Mutuality.find(params[:id])
    @address = Address.find(@mutuality.address_id)
  end

  def update
    @mutuality = Mutuality.find(params[:id])
    @address = Address.find(@mutuality.address_id)

    if @address.update_attributes(params[:address])
      if @mutuality.update_attributes(params[:mutuality])
        redirect_to mutualities_path, :notice => "Mutuality updated with succes!"
      else
        render "edit"
      end
    else
      render "edit"
    end

  end

  def destroy
    @mutuality = Mutuality.find(params[:id])
    @address = Address.find(@mutuality.address_id)
    @mutuality.destroy
    @address.destroy
    redirect_to mutualities_path
  end

end
4

2 に答える 2

0

私はついに物事を機能させることができました!Nathanvda が教えてくれた変更を加えましたが、機能させるためにいくつか追加する必要がありました。まだ小さな問題が 1 つあります。アドレスを削除することはできません。Mutuality のみを削除します。何か案は?

アドレス.rb

class Address < ActiveRecord::Base
  #attr_accessible :street, :number, :zipcode, :city
  attr_protected :id

  has_one :mutuality

  validates_presence_of :street, :number, :city

end

Mutuality.rb

class Mutuality < ActiveRecord::Base
  #attr_accessible :name, :phone, :contact, :address_id
  attr_protected :id, :address_id

  belongs_to :address
  accepts_nested_attributes_for :address, :allow_destroy => true

  validates_presence_of :name, :phone, :contact
  validates_length_of :name, :minimum => 5
  validates_uniqueness_of :name

end

これは、show.html.erb で使用するリンクです。

<p>
    <%= link_to "Back", mutualities_path %> |
    <%= link_to "Edit", edit_mutuality_path %> |
    <%= link_to "Delete", @mutuality, :confirm => "You are going to delete " +  @mutuality.name + ". Do you wish to continue?", :method => :delete %>
</p>

そして、これがdestroy関数です:

  def destroy
    @mutuality = Mutuality.find(params[:id])
    if @mutuality.destroy
      redirect_to mutualities_path, :notice => "Mutuality deleted with succes!"
    else
       redirect_to mutualities_path, :error => "A problem has occured."
    end
  end

マティアス

于 2013-02-25T10:59:31.497 に答える
0

Rails は、ネストされた属性を自動的に処理できます。あなたはそれをすべて手動で行っています。モデルで関連付けを正しく定義したかどうかわかりません。

したがって、モデルに次のように記述する必要があります。

class Mutuality
  belongs_to :address
  accepts_nested_attributes_for :address
end

そしてコントローラーで、次のように書くことができます:

def create
  @mutuality = Mutuality.new(params[:mutuality])

  if @mutuality.save
    redirect_to mutualities_path, :notice => "Mutuality saved with succes!"
  else
    render "new"
  end
end    

HTH。

于 2013-02-22T15:11:33.547 に答える