只在Rails中编辑某些字段

时间:2018-11-22 17:05:37

标签: ruby-on-rails ruby-on-rails-5

我有一个用户模型,其中包含用于first_name,last_name,email和password的字段。用户在其用户个人资料页面下注册后,我想允许某些字段而不是其他字段显示在表单上以更新部分用户信息。

例如,当我呈现表单供他们编辑其姓名时,我只希望将first_name显示为字段。我该如何处理?我是否应该做出新的路线和控制器操作,以便仅更新此字段?还是我只是隐藏所有其他字段并在后台提交它们而用户看不到它们?

<div class="signup_user">
  <div class="container-fluid">
    <div class="col-md-5 col-sm-12 centered">

      <%= form_for(@user) do |form| %>

      <%= render "shared/errors", object: @user %>
      <%= render "shared/flash" %>

        <div class="card card-default">
          <div class="card-body">

            <h1>Create account</h1>  

            <%= form.label :first_name %>
            <%= form.text_field :first_name, size: 40, autofocus: true, class: "required form-control" %>              

            <%= form.label :last_name %>
            <%= form.text_field :last_name, size: 40, class: "required form-control" %>

            <%= form.label :email %>
            <%= form.email_field :email, size: 40, class: "required form-control" %>

            <%= form.label :password %>
            <%= form.password_field :password, size: 40,  placeholder: "At least 10 characters", class: "required form-control" %>

            <%= form.label :password_confirmation, "Confirm Password" %>
            <%= form.password_field :password_confirmation, size: 40, class: "required form-control" %><br>

            <%= form.submit "Submit", class: 'btn btn-block btn-outline-primary' %>

           <% end %>

           <hr>
           <p>Already have an account? <%= link_to "Sign In", new_session_path %></p>

        </div>
      </div>

    </div>
  </div><!--./container-->
</div><!--./signup_user-->

在初始注册后,我只想显示1个这样的字段即可编辑用户名。

<div class="signup_user">
      <div class="container-fluid">
        <div class="col-md-5 col-sm-12 centered">

          <%= form_for(@user) do |form| %>

          <%= render "shared/errors", object: @user %>
          <%= render "shared/flash" %>

            <div class="card card-default">
              <div class="card-body">


                <%= form.label :first_name %>
                <%= form.text_field :first_name, size: 40, autofocus: true, class: "required form-control" %>              



        </div>
      </div><!--./container-->
    </div><!--./signup_user-->

3 个答案:

答案 0 :(得分:1)

最简单的方法是使用action_name帮助器并创建一些条件逻辑,这些条件逻辑将有条件地呈现您只想在新操作中显示的字段,例如action_name == "new"

答案 1 :(得分:1)

我将在控制器上对强参数进行两个定义:

def create_params
  params.require(:user).permit(:first_name, :last_name, :email, :password)
end

def update_params
  params.require(:user).permit(:email, :password)
end

然后在您的create / update方法中仅允许每个不同的定义。如果仅根据操作限制参数,则不需要新视图或新模型。

def create
  @user.create(create_params)
  redirect_to users_path
end

def update
  @user.update_attributes(update_params)
  redirect_to users_path
end

对我来说很有道理,因此您不必创建任何多余的东西。然后,将以应有的方式以安全的方式拒绝字段。然后,您可以使用action_name == 'edit'或类似方法调整视图。

答案 2 :(得分:-1)

您可以通过创建新模型来生成其他视图。

示例:

models / user_edit.rb

class User_Edit < User
end

models / user.rb

class User < ApplicationRecord
...
end

路线

  resources :users
  devise_for :users, path: 'users', controllers: {
        sessions:           "users/sessions",
        passwords:          "users/passwords",
        registrations:      "users/registrations",
        confirmations:      "users/confirmations",
      }
  devise_for :users_edit, path: 'users_edit', controllers: {
        registrations:      "users_edit/registrations",
      }

因此您将:

views/users/registrations/edit.html

views/users_edit/registrations/edit.html