Ruby on rails 试图理解设计和资源的形式

Ruby on rails 试图理解设计和资源的形式,ruby-on-rails,devise,Ruby On Rails,Devise,我对Rails非常陌生,我试图理解Desive对待用户资源的方式以及表单是如何工作的 在app/views/designe/sessions/new.html.erb中,有以下未经我修改的代码 <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> <%= devise_error_messages

我对Rails非常陌生,我试图理解Desive对待用户资源的方式以及表单是如何工作的

在app/views/designe/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 %>
这就是Desive如何知道在表单中使用什么资源的方式吗?如果我更改了配置路由,表单会在提交时修改数据库中的其他记录吗

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

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

您可以使用终端中的rake routes | grep designe命令检查这些路由。使用routes designe将控制器操作映射到视图,以便他知道操作designe/sessionnew使用designe/sessions/new.html.erb中的视图,并且它将使用url/users/sign_in。此外,路由还区分GET和PUT。调用新操作时,将执行GET请求并显示表单。当您提交登录或注册Desive/SessionCreate或Desive/RegistrationCreate表单时,您将执行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
因此,在Desive_控制器内部,您可以在github中显示,或者通过执行rails generate Desive:controller[scope]在应用程序中生成。 在本例中,RegistrationCreate设备将使用以下代码创建一个新用户:

build_resource(sign_up_params)
就我对Deave的有限理解而言,它类似于:

@user = User.new(input_params)
其中输入参数为rails5强参数。您注册的用户类型和注册位置取决于输入参数和您使用的模型。模型用户将写入数据库中的用户表

设计

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

执行此操作非常简单,您需要在app/controllers/application_controller.rb中创建以下方法来向designe强参数添加参数

您应该创建迁移以将这些列添加到users表中

然后您需要编辑视图designe/registrations/new.index.html、edit.index.html和所有其他视图

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


哇,信息量大,很有帮助,谢谢!关于强参数的一个问题是,这些参数是否应该通过应用程序_controller.rb上的before过滤器完成,例如,config _allowed _参数和一个名为相同的私有方法?我完成了上述操作,它几乎完全工作了。我要做的唯一一件额外的事情是在before操作中添加一个if,它的内容是:before\u action:configure\u allowed\u parameters,if:designe\u controller?再次感谢您的精彩解释!很高兴它起作用了。我现在刚读过,有什么问题尽管问我。谢谢法布里齐奥
@user = User.new(input_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