1

管理者がユーザーのユーザー権限のオンとオフを切り替えてデータベースに保存できるカスタム フォームを作成しようとしています。ページは正常に生成され、送信ボタンはアクションに正常に送信されますが、データベースには何も保存されず、最初のビューが再びレンダリングされるだけなので、私は何か完全に間違っているに違いありません。誰かが私が間違っていることを見ることができますか?

コード

ルート:

resources :users do
  member do
    get 'assign'
    put 'assign_update'
  end
end
...

コントローラー (この奇妙な方法は、管理者やその他の属性にアクセスできないという事実を回避しようとする試みです。混乱する可能性があります。):

...
def assign
  @user = User.find(params[:id])
end

def assign_update
  admin_protected = params[:user].delete(:admin)

  @user = User.find(params[:id])
  @user.admin = admin_protected

  if @user.save
    flash[:success] = "User updated"
    redirect_to users_path
  else
    render 'assign'
  end
end

意見:

...
<%= form_for(@user, url: { controller: 'users', 
  action: 'assign_update'}, method: 'put') do |f| %>
  <%= f.label :admin, 'Is admin?', class: 'checkbox inline' %>
  <%= f.check_box :admin %>
  <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>
<% end %>
4

2 に答える 2

1

質問の下のコメントセクションでの会話を要約すると...

問題は、他のユーザー モデル属性の検証であることが判明しました。saveメソッドの実行時に検証に合格しなかったため、ユーザー インスタンスを保存できませんでした。その結果、Rails は割り当てビューをレンダリングするだけでした。

update_attributeメソッドは、モデルの検証も一括代入保護もなしに属性を更新します。この場合、adminattribute はこれら 2 つの基準に適合します。

于 2013-02-22T20:22:28.720 に答える
0

モデルで attr_accessible を使用し、params からこれらのフィールドを手動で選択して個別に割り当て、attr_accessible 宣言に割り当てられたフィールドのリストに admin フィールドが含まれていないことを確認する必要があります。

そう

def assign_update
  admin_protected = params[:user].delete(:admin)

  @user = User.find(params[:id])
  @user.admin = admin_protected

  if @user.save
    flash[:success] = "User updated"
    redirect_to users_path
  else
    render 'assign'
  end
end

になる

    def assign_update
#      admin_protected = params[:user].delete(:admin)

      @user = User.find(params[:id])
      @user.admin = params[:user][:admin]

      if @user.save
        flash[:success] = "User updated"
        redirect_to users_path
      else
        render 'assign'
      end
    end

問題は、あなたのアプローチではまだ大量割り当てを行っていることです。

実際に何が起こっているかをデバッグするには、ログ ファイルの出力を注意深く確認する必要があります。

アップデート

エラーリストを確認してください。以下をフォームに追加します

  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this account from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

何が問題で、どのように修正するかについて、ユーザーに明確なアイデアを提供する必要があります。

于 2013-02-22T19:01:10.763 に答える