редактировать только определенные поля в Rails - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть модель пользователя, в которой есть поля для имени, фамилии, адреса электронной почты и пароля.После того, как пользователь зарегистрируется на странице своего профиля, я бы хотел, чтобы некоторые поля, а не другие отображались в форме, обновляли часть информации о пользователе.

Например, я хотел бы, чтобы отображалось только имя_первого именикак поле, когда я отрисовываю форму для редактирования своего имени.Как мне справиться с этим?Должен ли я создать новый маршрут и действие контроллера, которое позволит мне обновить только это одно поле?или я просто скрываю все остальные поля и отправляю их в фоновом режиме, чтобы пользователь их не видел?

<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 голосов
/ 22 ноября 2018

Самый простой способ - использовать помощник action_name и создать некоторую условную логику, которая будет условно отображать поля, которые вы хотите показать только в новом действии, например, action_name == "new"

0 голосов
/ 22 ноября 2018

Я бы сделал два определения сильных параметров на контроллере:

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' или аналогичного.

0 голосов
/ 22 ноября 2018

Вы можете создать дополнительный вид, создав новую модель .

Пример:

models / user_edit.rb

class User_Edit < User
end

модели / 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...