首页 > 解决方案 > 仅编辑 Rails 中的某些字段

问题描述

我有一个用户模型,其中包含 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-->

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

解决方案


我会在控制器上定义两个强参数:

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'或类似的方式调整视图。


推荐阅读