rails通过电子邮件更新用户的记录

时间:2016-03-05 16:47:22

标签: ruby-on-rails associations

我有一个带有帐户模型和帐户管理员(用户)的应用。

我希望客户经理能够通过输入他们的电子邮件将其他用户添加到该帐户。

应将新帐户管理员的帐户ID添加到新用户的记录中。

我的模型看起来像

class Account < ActiveRecord::Base
  has_many users
  ...
end

class User < ActiveRecord::Base
  belongs_to account
  ...
end

在控制台中,它相当简单。

u = User.find(2) 
u.update_attributes(account_id: 1)

但我不确定如何在网站上执行此操作。

我有以下部分呈现罚款,但当我在框中发送电子邮件时没有任何反应。

我收到消息,未添加用户。

<h4>Add User</h4>
<div class = "row">
    <div class="col-md-6 col-md-offset-3">
        <%= form_for(:add_user, url: add_users_path) do |f| %>
      <%= f.hidden_field @account = Account.find(params[:id]) %>
      <%= f.label :email %>
      <%= f.email_field :email, class:'form-control' %>
      <%= f.submit "Submit", class: "btn btn-primary" %>
  <% end %>
    </div>
</div>

我不一定要/需要路由到另一个页面,例如&#34; url:add_users_path&#34;但如果没有那一行,代码就会中断并且不会渲染。

我将此添加到user.rb

def add_user_to_account
  update_attribute(:account_id)
end

我也创建了这个控制器

class AddUsersController < ApplicationController
    before_action :get_user,   only: [:edit, :update]

  def new
  end

  def edit
  end

  def create
    @user = User.find_by(email: params[:email])
    if @user
        @user.add_user_to_account
        flash[:info] =  "Added User to Account"
        redirect_to accounts_url
    else 
        flash[:danger] = "User NOT Added"
        redirect_to accounts_url
    end 
  end

  def update
    if params[:user][:account_id].empty?
      @user.errors.add(:account_id, "can't be empty")
      render 'edit'
    elsif @user.update_attributes(user_params)
      log_in @user
      flash[:success] = "Account Updated"
      redirect_to @user
    else
      render 'edit'
    end
  end  


  private

    def user_params
      params.require(:user).permit(:account_id, :user_id)
    end

    def get_user
      @user = User.find_by(email: params[:email])
    end
end

我是否在正确的轨道上?有一个更好的方法吗?

更新:添加了架构

create_table "accounts", force: :cascade do |t|
    t.string   "name"
    t.integer  "account_manager_id"
    t.integer  "subscription_id"
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
  end

create_table "users", force: :cascade do |t|
   t.string   "name"
    t.string   "password_digest",   null: false
    t.string   "remember_digest"
    t.string   "email",             null: false
    t.string   "activation_digest"
    t.boolean  "activated"
    t.datetime "activated_at"
    t.string   "reset_digest"
    t.datetime "reset_sent_at"
    t.datetime "created_at",        null: false
    t.datetime "updated_at",        null: false
    t.boolean  "access_granted"
    t.boolean  "requested_access"
    t.string   "slug"
    t.integer  "account_id"
  end

1 个答案:

答案 0 :(得分:1)

我认为你错了。

您使用params[:email]代替params[:add_user][:email]通过电子邮件找到用户

在您的控制器中

class UsersController < ApplicationController
  ...
  def add_users
     user = User.find_by(email: params[:add_user][:email])
     if user
       user.add_user_to_account
       ...
     else
       ...
     end
  end 
end