Rails Form Input не сохраняется, становится пустым после отправки - PullRequest
0 голосов
/ 27 мая 2019

Рельсы для начинающих здесь!

Я создал форму для редактирования информации о пользователе, и я пытаюсь отредактировать полное имя пользователя, которое изначально пусто. Однако, когда я нажимаю «отправить», поле полного имени становится пустым, и форма сообщает мне, что мои изменения не могут быть сохранены, потому что полное имя не может быть пустым. Я видел людей с такой же проблемой, но у них была эта проблема, потому что у них был драгоценный камень «protected_attributes».

Это вывод моего сервера:

    Started PATCH "/users/9b62e326-ca9f-47b9-9e91-256e42ca52fc" 
    for 127.0.0.1 at 2019-05-26 21:30:22 -0400
    Processing by UsersController#update as HTML
    Parameters: {"utf8"=>"✓","authenticity_token"=>"G8zS2fWVdOBAc==", "user"=>{"full_name"=>"", 
    "email"=>"email@gmail.com"}, "commit"=>"Update User", 
    "id"=>"9b62e326-ca9f-47b9-9e91-256e42ca52fc"}
    User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE 
    "users"."slug" = ? LIMIT ?  [["slug", "9b62e326-ca9f-47b9- 
    9e91-256e42ca52fc"], ["LIMIT", 1]]
    ↳ app/controllers/users_controller.rb:57 (0.1ms)  begin transaction
    ↳ app/controllers/users_controller.rb:37
   (0.1ms)  rollback transaction
   ↳ app/controllers/users_controller.rb:37
   Rendering users/edit.html.erb within layouts/application
   Rendered users/_form.html.erb (6.6ms)
   Rendered users/edit.html.erb within layouts/application 
   (12.7ms)
   Category Load (0.3ms)  SELECT "categories".* FROM "categories"
   ↳ app/views/layouts/application.html.erb:31
   User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE 
   "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], 
   ["LIMIT", 1]]
   ↳ app/views/layouts/application.html.erb:38
   Completed 200 OK in 137ms (Views: 126.5ms | ActiveRecord: 1.4ms)

Вот мой код формы:

    <%= form_for @user, html: { multipart: true } do |f| %>

    <% if @user.errors.any? %>
    <h2><%= pluralize(@user.errors.count, "error")%> prevented 
    this post from saving:</h2>
    <ul>
    <% @user.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
    <% end %>
    </ul>
    <% end %>
    <%= f.label :full_name, "Full Name" %>
    <%= f.text_field :full_name %>

    <%= f.label "Upload profile picture" %><br><br />
    <%= f.file_field :profile %><br/><br/>
    <br>



   <%= f.label "Email (Will not be published)" %><br>
   <%= f.text_field :email %>


   <% @full = @user.full_name %>

   <%= f.hidden_field :full_name, :value => @full %>

Пользовательский контроллер:

    class UsersController < ApplicationController
    before_action :find_user, only: [:show, :edit, :update, :destroy]
    before_action :authenticate_user!, only: [:show]



      def show
        @user = User.find(params[:id])
        @user_posts = @user.posts.all.order("created_at desc")
        @posts = Post.all.order("created_at desc")
      end

     def index
        @users = User.all.order("created_at desc")
     end

     def edit
     end

     def new
        @user = User.new(:email => 'test@example.com', :password => 
        'password', :password_confirmation => 'password', :full_name 
        => 'Jane Doe')
        @user.save
     end

    def create
        @user = User.new(user_params)
        @user.save

        if @user.save
            redirect_to @user, notice: "Your changes were successfully 
             saved!"
        else
            render 'new', notice: "Oh no! Your changes were not able 
            to be saved!"
        end
        end

        def update
          if @user.update_attributes(user_params)
          redirect_to @user, notice: "Your changes were saved!"
          else
             render 'edit'
          end
        end

        def destroy
           @user.destroy
           redirect_to users_path
        end

    private

    def user_params
       params.require(:user).permit(:email, :password, 
       :password_confirmation, :full_name, :slug)

    end

    def find_user
      @user = User.friendly.find(params[:id])
    end
    end

User.rb

    class User < ApplicationRecord
    extend FriendlyId
    friendly_id :full_name, use: :slugged

     devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :validatable
     has_many :posts


     validates :full_name, presence: true

     validates :email, presence: true

     def should_generate_new_friendly_id?
     slug.blank? || full_name_changed?
     end
     end

Я также использовал тот же формат формы для моей почтовой модели, поэтому я не уверен, почему существует проблема. Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

1 голос
/ 27 мая 2019

В вашем коде формы есть два поля для полного имени: одно текстовое поле и другое скрытое поле. Событие, если вы введете значение, скрытое значение обнулится. так что если вы удалите его, он будет работать.

    <% if @user.errors.any? %>
    <h2><%= pluralize(@user.errors.count, "error")%> prevented 
    this post from saving:</h2>
    <ul>
    <% @user.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
    <% end %>
    </ul>
    <% end %>
    <%= f.label :full_name, "Full Name" %>
    <%= f.text_field :full_name %>

    <%= f.label "Upload profile picture" %><br><br />
    <%= f.file_field :profile %><br/><br/>
    <br>



   <%= f.label "Email (Will not be published)" %><br>
   <%= f.text_field :email %>
1 голос
/ 27 мая 2019

Вы не должны иметь text_field и hidden_field для одного и того же атрибута в одной форме

вы можете удалить

<% @full = @user.full_name %>
<%= f.hidden_field :full_name, :value => @full %>

в вашей форме у вас уже есть

<%= f.label :full_name, "Full Name" %>
 <%= f.text_field :full_name %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...