11

管理者が自分のWebサイトでユーザーを承認できるようにする簡単なリンクを作成しようとしています

この男が試みていたものと非常によく似ています:Rails 3では、button_toを使用してブール値を変更するにはどうすればよいですか?

これがどのように機能するはずだったかです:

  1. 管理者はリンクをクリックしてユーザーを承認します
  2. リンクはUsersControllerのアクティブ化関数を呼び出します
  3. ユーザーがモデル化するアクティブな関数呼び出し
  4. ユーザーモデルは、承認された属性をtrueに更新し、それを保存します

これが私がやろうとしていた方法です

私のusers#indexビューで

 <% @users.each do |user| %> 
 <%= link_to 'Approve', :action => "index", :method => 'activate', :id => user.id, :class => 'btn btn-mini btn-danger' %> 
<% end %> 

私のuserControllerで

def activate
  @user = User.find(params[:user])
  @user.activate_user
end

私のユーザーモデルでは

def activate_user 
  self.approved = 'true'
  self.save
end

と私のルート

devise_for :users, :controllers => { :registrations => "registrations" }

resources :users do
  member do
    get 'activate'
    put 'activate'
  end
end

match "users/:id/activate" => "users#activate"

リンクをクリックすると(ユーザーを承認するため)、ユーザーインデックスページに戻りますが(想定どおり)、ユーザーフィールド「承認済み」はまだfalseに設定されています:I

リンクをクリックした後に取得するURL:

  http://localhost:3000/users?class=btn+btn-mini+btn-danger&id=2&method=activate

何か案は?

アップデート

提案されたように、ivはlink_toヘルパーにURLを追加しました

<% @users.each do |user| %> 
  <%= link_to "Approve", :controller => "users", :id => user.id, :action => "activate", :method => :put, :approved => true %> 
<% end %>

ヘルパーリンクをクリックすると、

wrong number of arguments (1 for 2) 

app / controllers / users_controller.rb:7:in `activate'

def activate
  @user = User.find(params[:id])
  @user.update_attribute(params[:user])
  redirect_to "/users?approved=false"
end

エラーが@user.update_attribute(params [:user])である7行目

他に何を置くべきですか?

ああ、これがこの方法の私のルートです

match "/users/:id/activate" => "users#activate"

UPDATE V2 だから、私はその更新行を次のように変更しました:

@user.update_attributes(@user.approved, "true")

値をtrueに変更する以外は、やりたいことはすべて実行しているようです。

私はまた、true(およびupdate_attribute関数)と非文字列に1を使用しようとしました..ここでアイデアが不足しています笑

ソリューション

これは厄介ですが、私のユーザーモデルattr_accessor :approved では、モデルがデータベースに移動して:approved列を更新することはありませんでしたが、代わりにローカル変数が更新された:approvedため、次に列を確認したときに、もちろん:approved値は変更されていません

tldr?モデルにattr_accessorがあり、更新しようとしている列と同じ名前の場合=>削除します

4

3 に答える 3

8

以下のコードを更新できます

あなたが見る

<% @users.each do |user| %> 
<%= link_to 'Approve', active_user_path(user) %> 
<% end %>

あなたのコントローラー

def activate
  @user = User.find(params[:id])
  if @user.update_attribute(:approved, true)
    redirect_to "something"
  else
   render "something"
  end 
end

あなたのルート

match "users/:id/activate" => "users#activate", :as => "active_user"

希望があなたを助けることができます。

于 2012-11-03T13:44:03.457 に答える
2

link_toを正しく呼び出していないようです。アクションがURLの一部ではなく、httpパラメーターとして存在することに注意してください。

URLは次のようになります

http://localhost:3000/users/123/activate

このページの例を見てください:

http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to

:controller =>'users'、:action=>'activate'を使用する必要があると思います。

ここでパスにも文字列を使用できることを忘れないでください。"/users/${@user.id}/activate"

于 2012-11-01T17:57:52.570 に答える
0

このattr_accessorメソッドは、インスタンス変数と、その変数のゲッターとセッターを作成します。

その名前でデータベース列を更新しようとすると、代わりにインスタンス変数が使用されます。これは、実際の列として機能するがメモリに保存される「仮想列」が必要な場合に役立ちます。

その列の一括割り当てを可能にするデータベース列の場合attr_accessible(これはRails 4で非推奨になります)、またはメソッドを使用して列のアクセシビリティを定義してActiveRecord処理することはできません。

于 2013-03-30T05:51:37.190 に答える