1

プロジェクトの作成と更新を許可する CRUD を作成する必要があり、属性の 1 つはプロジェクトを所有するクライアントです。プロジェクトが作成または編集されると、select タグを使用してクライアントが選択されます。

私はこのモデルを持っています:

class Cliente < ActiveRecord::Base
  attr_accessible :nombre
  has_many :proyectos
end

class Proyecto < ActiveRecord::Base
  attr_accessible :nombre, :cliente_id
  belongs_to :cliente
end

このコントローラー:

class ProyectosController < ApplicationController
  def new
    @proyecto = Proyecto.new
    @clientes = Cliente.order(:nombre)
  end

  def edit
    @proyecto = Proyecto.find(params[:id])
    @clientes = Cliente.order(:nombre)
  end

  def create
    @proyecto = Proyecto.new(params[:proyecto])
      if @proyecto.save
        redirect_to @proyecto, notice: 'Proyecto was successfully created.'
      else
        render action: "new"
      end
    end
  end

  def update
    @proyecto = Proyecto.find(params[:id])
    if @proyecto.update_attributes(params[:proyecto])
        redirect_to @proyecto, notice: 'Proyecto was successfully updated.'
      else
        render action: "edit"
    end
  end
end

ビューのこのフォーム(haml):

= form_for @proyecto do |f|
  = f.label :cliente
  = f.collection_select :cliente_id, @clientes, :id, :nombre
  = f.label :nombre
  = f.text_field :nombre
  = f.submit 'Save'

コードは scaffold で生成されました。不要な部分を削除して、select を作成するコードを追加しただけです。

最初に、モデル Proyecto で私はこれを持っていました:

attr_accessible :nombre

しかし、「保護された属性を一括割り当てできません: cliente_id」というエラーが表示されます。同様の問題をstackoverflowで検索すると、cliente_idをattr_accessibleに追加する必要があることがわかりましたが、Googleで検索すると、セキュリティ上の問題によりattr_accessibleにフォアイングキーを追加してはならないことがわかりました。これは矛盾しています。

これは、cliente_id を attr_accessible に追加して、作成および更新メソッドをコーディングする正しい方法ですか? そうでない場合、正しい方法は何ですか?

私はレール3.2.8とルビー1.9.3p194で作業しています

4

1 に答える 1

2

この場合、client_id を attr_accessible にする必要があります。その理由は、ユーザーがフォームの選択ボックスを介してクライアントを設定できるようにするためです。

ただし、これはセキュリティ上の問題を引き起こします。特定のユーザーに、選択できる 3 つの異なるクライアント (ID: 1、2、3) のみを表示しているとします。ユーザーがフォームを手動で変更すると、ID #4 のクライアントを自分のプロジェクトに割り当てることができますが、これはセキュリティの問題または単なるバグである可能性があります。

セキュリティの問題を解決するには、プロジェクト モデルに検証を追加して、クライアント ID が有効であることを確認します。

于 2012-10-06T22:36:54.630 に答える