0

私は単純なネストされたフォームを持っており、隠しフィールドでネストされた属性を設定しています:

<%= role_form.hidden_field :company_id, :value => session[:company_id] %>

ここでの考え方は、現在のセッション変数によるセットCompanyを介して、このネストされたモデル (ロール ベースのパーミッション システム) を別のモデルに関連付けているということです。company_id私の問題は、ユーザーがリクエストを送信し、任意のロールを作成/更新して、company_id別の会社のアカウントにアクセスできることです。

ネストされたモデル属性を強制的にこのセッション値または検証にすることはできますか?

私は作成を考えていました:

@user = User.new(params[:user])
@user.roles.first.company_id = session[:company_id]

更新のために、私は同じことをすることができました。

私が試した検証に関しては:

accepts_nested_attributes_for :roles, :limit => 1, :allow_destroy => true , :reject_if => proc { |attributes| attributes['company_id'] != session[:company_id] }

モデルのセッション情報にアクセスできないようです。

これらの方法のいずれかでこれを行うことができるかどうか、誰にも考えがありますか?

4

1 に答える 1

1

company_id をセッションに保存するのではなく、ランダムに生成されたトークン列を会社に追加し、Company.find_by_token(session[:token]) を実行して ID を取得する必要があります。この Railscastの current_user メソッドが authentication でどのようになっているのかを見ると、同じ考えです。

編集:申し訳ありませんが、あなたの質問を誤解しました。ビューには、company_id フィールドを非表示にするべきではありません。create メソッドで手動で設定する必要があります。

@user = User.new(params[:user])
@user.company_id = session[:company_id]

また、モデル内で company_id を一括割り当てから保護することで、ユーザーが入力名を変更して company_id が設定されるのを防ぐことができます。

attr_protected :company_id

詳細については、大量割り当て保護に関する Rails ガイドを参照してください。注: より一般的な解決策は、次のようなものです。

class ApplicationController < ActionController::Base

  protect_from_forgery

  def current_company
    @current_company ||= Company.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
  end
end

class User < ApplicationController
  def create
    @user = current_company.users.build(params[:user])
  end
end

更新 2:

したがって、ユーザーとロールを作成していて、それらに対して個別の検証を行いたい場合、これで目的が達成されるはずです。

role_params = params[:user].delete :role # Change to the appropriate symbol for your form
@user = User.new(params[:user])
role = @user.roles.build(role_params)
role.company_id = session[:company_id]

if(@user.save and role.user_id = @user.id and role.save) # Might want to just check for valid instead of trying to save
...
于 2012-08-11T23:38:15.453 に答える