【问题标题】:Rails 4 Update Data Through View PageRails 4 通过查看页面更新数据
【发布时间】:2014-10-08 13:38:57
【问题描述】:

我目前有一个名为“用户”的视图页面。在我的视图页面中,我正在显示一个表,其中包含从用户表中提取的属性,例如名字、姓氏、上次登录、管理员等......在管理字段中,它从用户表中显示 true 或 false .

我想要完成的是创建一个下拉列表,显示用户当前的 admin 值(true 或 false),然后能够从视图页面更改此属性。目前,我必须使用服务器上的控制台手动将用户的值更改为 true 或 false 以授予或撤销管理员权限。不用说,这很不方便。我对 Rails 还很陌生,到目前为止一直在使用脚手架。我不知道如何做到这一点,任何建议将不胜感激!

用户架构:

create_table "users", force: true do |t|
t.string   "email",                  default: "",    null: false
t.string   "encrypted_password",     default: "",    null: false
t.string   "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer  "sign_in_count",          default: 0,     null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string   "current_sign_in_ip"
t.string   "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.boolean  "admin",                  default: false
t.string   "first_name"
t.string   "last_name"
end

管理控制器:

class AdminController < ApplicationController
before_action :authenticate_user!

def users
 @users = User.all.order('last_name ASC')
end

def reports
  end
end

用户查看页面:

  <table class="table table-hover table-condensed">
      <thead>
        <tr>
          <th>Last Name</th>
          <th>First Name</th>
          <th>Email</th>
          <th>Creation Date</th>
          <th>Last Sign In</th>
          <th>IP Address</th>
          <th>Admin</th>
        </tr>
      </thead>
      <tbody>
        <% @users.each do |user| %>
          <tr>
            <td><%= user.last_name %></td>
            <td><%= user.first_name %></td>
            <td><%= user.email %></td>
            <td><%= user.created_at.strftime("%-m/%-d/%y") %></td>
            <td><%= user.current_sign_in_at.strftime("%-m/%-d/%y") %></td>
            <td><%= user.current_sign_in_ip %></td>
            <td><%= user.admin %></td>
          </tr>
        <% end %>
      </tbody>
    </table>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-4.1


    【解决方案1】:

    您可以通过几种不同的方式完成此操作。例如,您可以让下拉列表中的链接触发方法toggle_admin,如果用户是管理员则删除管理员,如果是这种情况,则反之。

    首先创建路由,在routes.rb中:

    resource :users do
      get :toggle_admin
    end
    

    在你看来:

    <%=link_to (@current_user.admin ? 'Remove admin' : 'Make admin'), toggle_admin_users_path %>
    

    在你的控制器中,你可以有这样的东西:

    def toggle_admin
      @current_user.update_attribute :admin, (@current_user.admin ? false : true)
    end
    

    嗯...是的,我不知道。可以工作。如您所见,我在这里假设您有一个 @current_user 变量来获取相关用户,否则将 user.id 发送到这些方法中,从 url 参数或直接到控制器方法中。

    【讨论】:

      【解决方案2】:

      首先,您需要一个路由和一个相应的控制器操作来处理更新。

      以 RESTful 方式,这将是 routes.rb: resources :users, only: [:update]

      在您看来,您需要一个 from,它将数据发送到控制器: <%= form_for user do %> ...

      @users.each 中的每个用户都应该有自己的表单和提交按钮。要创建select(即带有true/false 值的下拉菜单),请使用Rails form helper

      控制器动作可能如下所示: def update user = User.find(params[:id]) user.update_attributes(user_params) end private def user_params params.require(:user).permit(:admin) end

      【讨论】:

      • 您好安德烈,感谢您的建议。从下拉列表中选择一个值并单击更新框后,我会收到路由错误。错误状态为“未初始化的常量 UsersController”。我没有用户控制器,只有管理员控制器。关于我为什么会收到此错误的任何想法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      相关资源
      最近更新 更多