【问题标题】:Trying to understand Devise and resources in forms试图了解表单中的设计和资源
【发布时间】:2017-03-13 19:07:15
【问题描述】:

我是 Rails 的新手,我正在尝试了解 Devise 处理用户资源的方式以及表单的工作方式。

在 app/views/devise/sessions/new.html.erb 里面有以下代码(未经我修改)

  <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
  <%= devise_error_messages! %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true %>
  </div>

  <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
    <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
  <% end %>

  <div class="field">
    <%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
    <%= f.password_field :password, autocomplete: "off" %>
    <% if @minimum_password_length %>
      <br />
      <em><%= @minimum_password_length %> characters minimum</em>
    <% end %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "off" %>
  </div>

  <div class="field">
    <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
    <%= f.password_field :current_password, autocomplete: "off" %>
  </div>

  <div class="actions">
    <%= f.submit "Update" %>
  </div>
<% end %>

然后在 config/routes.rb 中有一行

devise_for :users

这就是设计知道在表单中使用什么资源的方式吗?如果我更改了配置路由,表单会在提交时修改数据库中的不同记录吗?

最终,我希望能够修改我添加的用户数据的其他方面(例如用户名)。我是否可以在此视图中添加额外的表单字段并成功修改用户中的这些列?

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    这就是设计知道在表单中使用什么资源的方式吗?如果我更改了配置路由,表单会在提交时修改数据库中的不同记录吗?

    您可以在终端中使用rake routes | grep devise 命令检查这些路线。使用路由设计将controller#actions 映射到视图,这样他就知道devise/session#new 的动作要使用devise/sessions/new.html.erb 中的视图,并且它将使用url /users/sign_in。路由也区分 GET 和 PUT。当您调用一个新操作时,您将执行一个 GET 请求并显示一个表单。当您提交登录或注册表格(devise/sessions#createdevise/registrations#create)时,您将执行 put 操作。 您修改或创建的记录取决于在数据库中执行查询的控制器操作。

            new_user_session GET      /users/sign_in(.:format)                                    devise/sessions#new
                user_session POST     /users/sign_in(.:format)                                    devise/sessions#create
        destroy_user_session DELETE   /users/sign_out(.:format)                                   devise/sessions#destroy
           new_user_password GET      /users/password/new(.:format)                               devise/passwords#new
          edit_user_password GET      /users/password/edit(.:format)                              devise/passwords#edit
               user_password PATCH    /users/password(.:format)                                   devise/passwords#update
                             PUT      /users/password(.:format)                                   devise/passwords#update
                             POST     /users/password(.:format)                                   devise/passwords#create
       new_user_confirmation GET      /users/confirmation/new(.:format)                           devise/confirmations#new
           user_confirmation GET      /users/confirmation(.:format)                               devise/confirmations#show
                             POST     /users/confirmation(.:format)                               devise/confirmations#create
    

    所以在你可以在 github 中显示的 devise_controller https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb 或者你可以通过执行 rails generate devise:controllers [scope] 在你的应用程序中生成。 在此示例中,registrations#create 设计将使用以下代码创建一个新用户:

    build_resource(sign_up_params)
    

    就我对设计的有限理解而言,它类似于做:

    @user = User.new(input_params)
    

    其中 input_params 是 rails5 强参数。您注册的用户类型和注册地点取决于 input_params 和您使用的模型。模型用户将写入数据库中的用户表。

    设计 http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

    最终,我希望能够修改我添加的用户数据的其他方面(例如用户名)。我是否可以在此视图中添加额外的表单字段并成功修改用户中的这些列?

    这样做很简单,您需要在app/controllers/application_controller.rb 中创建以下方法以将参数添加到devise strong params

    def configure_permitted_parameters
        devise_parameter_sanitizer.permit(:sign_up, keys: [:firstname, :lastname, :country, :location...])  
        devise_parameter_sanitizer.permit(:account_update, keys: [:firstname, :lastname, :country, :location...]) 
    end  
    

    您应该创建一个迁移以将这些列添加到用户表中。

    然后您需要编辑视图devise/registrations/new.index.htmledit.index.html 和所有其他视图。

    有关更多详细信息,请查看在线指南或 stackoverflow 讨论。

    How do I add additional fields to the Devise 'sign up' page?

    Adding Fields To Devise Sign Up Using Rails 4

    【讨论】:

    • 哇,内容丰富且乐于助人,谢谢!关于强参数的一个问题,是否应该通过 application_controller.rb 上的 before 过滤器来完成(例如 config_permitted_parameters 和一个称为相同的私有方法)?
    • 我完成了上述操作,它几乎完全有效。我唯一需要做的就是在之前的操作中添加一个 if ,因此它显示为:before_action :configure_permitted_parameters, if: devise_controller? 再次感谢您的精彩解释!
    • 很高兴它成功了。我现在才读到,有什么问题可以问我。谢谢。法布里齐奥
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多