1

こんにちは、私はまだ学生で、ソフトウェア エンジニアリングのコースを受講しています。この大きなプロジェクト (Web デザイン) があり、Rails を使用していますUsers。2 つの外部キーと. ユーザーが作成済みのグループを作成または参加するたびに、ユーザーの ID と group_id がテーブルに追加されますGroupsGroupUsersuser_idgroup_idGroupUsers

module GroupUsersHelper
   def join
      @group_id = params[:id]
      @user_id = params[:user_id]
      @newuser= GroupUser.new(:group_id => @group_id, :user_id => @user_id)
      @newuser.save
      redirect_to(:controller => 'groups', :action => 'show', :id => @group_id)
   end
end

ここで、 からレコードを破棄する必要があるメソッド Leave グループを作成する必要があるため、GroupUsersこのコードもGroupUsersHelper

  def leave
      @group_id = params[:group_id]
      @user_id = params[:user_id]
      @group_user_id = params[:group_user_id]
      @newuser= GroupUser.find(@group_user_id).where(:group_id => @group_id, :user_id =>
      @user_id)
      @newuser.destroy
      redirect_to(:controller => 'groups', :action => 'show', :id => params[:id])
   end

しかし、私はこのエラーが発生します

ActiveRecord::RecordNotFound in GroupsController#leave

GroupUserIDがないと見つからない

コードに関する詳細情報が必要な場合は、お知らせください。

4

5 に答える 5

1
Model.find(params[:id]) will generate such kind of query

 *Lets take an example : GroupUser.find(params[:id]) will generate sql equivalent*
 select * from group_users where id = params[:id]

If you want to add where condition do something like this
GroupUser.where("# id ={params[:id]} and someColumn = #{somevariable}")
于 2015-12-31T05:35:54.067 に答える
0

groupuser_idparams ハッシュでを渡していません。@group_idandに保存する代わりに、@user_idこれを試してください:

@newuser= GroupUser.find_by_group_id_and_user_id(params[:group_id],params[:user_id])

適切なリダイレクトを作成する方法を理解できるように、params ダンプを追加で投稿していただけないでしょうか。これも問題になるからです。

于 2013-04-06T22:11:16.027 に答える
0

@max pleaner は正しいです。Model.find().where() を使用しないでください。

それは正しくありません。考えてみれば、冗長であることがわかります。破棄したい関連付けを見つけるには、params[:group_id] と params[:user_id]、または単に params[:group_user_id] が必要です。

params[:group_user_id] を leave メソッドに渡した場合は、関連付けを見つけるために必要なすべての情報が既にあります。

def leave
  @newuser= GroupUser.find(params[:group_user_id])
  @newuser.destroy
  redirect_to(:controller => 'groups', :action => 'show', :id => params[:group_id])
end

あるいは、params[:group_id] と params[:user_id] を leave メソッドに渡した場合:

def leave
  @newuser= GroupUser.find_by_group_id_and_user_id(params[:group_id], params[:user_id])
  @newuser.destroy
  redirect_to(:controller => 'groups', :action => 'show', :id => params[:group_id])
end

また、上記で省略したことに気付くコードには、他にもいくつかの冗長性があります。パラメータを find() メソッドに渡す前に、各パラメータをインスタンス変数に割り当てる必要はありません。

@model_id = params[:model_id]
@model= Model.find(@model_id)

#can be simplified to:

@model = Model.find(params[:model_id])

通常、ビューでアクセスする必要があるレコードまたはレコードのコレクション (アプリケーションのコンテキストでのグループなど) のインスタンス変数のみを作成します。

于 2015-12-31T18:16:16.573 に答える