У меня есть ошибка в моем файле HTML ERB для Rails - PullRequest
0 голосов
/ 25 июня 2019

Я хочу создать текстовое поле, которое принимает ввод, и когда вы нажимаете кнопку рядом с ним, оно сохраняет эти изменения в базе данных.Это будет запрос PUT, обновляющий значение в базе данных для этого конкретного пользователя (не зарегистрированный пользователь, это страница для администраторов, чтобы обновить значения для пользователей).

Это должна быть структура, (код ниже):

1) Создайте текстовое поле и кнопку для этого в show.html.erb

2) Создайте функцию с именем set_wistia_project_ID для этого в users_controller.rb, установитекнопка, равная этой :action

3) Создайте вспомогательную функцию с именем set_project_id в user.rb, которая вызывается set_wistia_project_ID, которая фактически обновляет базу данных.Я решил разделить его на две функции, потому что заметил, что многие Rails-проекты имеют тенденцию разделять и разбивать функциональность на контроллер и модель.

4) Отредактируйте мой routes.rb, включив в него какой-нибудь странный код, который, если честно, понятия не имеет, что он на самом деле делает.Но без него все приложение падает на Heroku.Так что я оставляю это там.Найдено в сообщении StackOverflow.

Мой show.html.erb:

<% provide(:title, @user.name) %>
<div class="row">
  <aside class="col-md-4">
    <section class="user_info">
      <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
        <br>
        <%= @user.email %>
        <br>
        <div class="row">
          <div class="col-md-6 col-md-offset-3">
            <%= form_for(@user) do |f| %>
              <%= render 'shared/error_messages' %>

              <%= f.label :wistia_project_id %>
              <%= f.text_field :wistia_project_id, class: 'form-control' %>

              <%= button_to "Save", :action => "set_wistia_project_ID", :method => :put, :form_class => "form-control" %>   
          </div>
        </div>
      </h1>
    </section>
  </aside>
</div>

Мой users_controller.rb:

  # Sets wistia_project_ID.
  def set_wistia_project_ID
    @user = User.find(params[:id])
    @user.set_project_id
  end

Мой user.rb:

  # Sets the wistia_project_ID.
  def set_project_id
    self.wistia_project_ID # HOW TO SET EQUAL TO INPUT?
  end

My routes.rb:

Rails.application.routes.draw do
  root 'static_pages#home'
  get 'password_resets/new'
  get 'password_resets/edit'
  get 'sessions/new'
  get  '/help',    to: 'static_pages#help'
  get  '/about',   to: 'static_pages#about'
  get  '/contact', to: 'static_pages#contact'
  get  '/signup',  to: 'users#new'
  post '/signup',  to: 'users#create'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :users do
    member do
      put 'set_wistia_project_ID'
    end
  end
  resources :account_activations, only: [:edit]
  resources :password_resets,     only: [:new, :create, :edit, :update]
end

Но проблема, с которой я сталкиваюсь, заключается в том, что при попытке перейти на show.html.erb происходит сбой приложения Heroku: (

Причина:

F, [2019-06-25T19:53:20.706881 #8] FATAL -- : [b2ed08bb-de52-417f-9ba8-8ec85629dce8] 
app/views/users/show.html.erb:30: 
syntax error, unexpected end-of-input, expecting end

Но мне это выглядит нормально?

1 Ответ

1 голос
/ 25 июня 2019

Синтаксическая ошибка состоит в том, что вы пропускаете <% end %> для блока <%= form_for(@user) do |f| %>.

Чтобы ответить на ваш вопрос о том, как получить доступ к параметру в методе модели - вы должны передать его в качестве аргумента:

@user.set_project_id(params[:wistia_project_ID])

И измените метод для принятия аргумента.Обратите внимание, я предполагаю, что вы действительно хотите сохранить это в базе данных, поэтому я добавляю вызов save.В качестве альтернативы вы можете вызвать update, который присваивает новое значение и сохраняет за один раз.

def set_project_id(val)
  self.wistia_project_ID = val # self is necessary here
  save # or self.save, but the self is unnecessary here
end

Однако при вызове save всегда успешно сохраняется запись, но все равновероятность ошибки, если проверка на уровне модели не удалась.Вы можете справиться с этим, используя flash: https://guides.rubyonrails.org/action_controller_overview.html#flash-now

или, если вам не нужно перенаправлять, можете просто использовать переменную экземпляра для хранения ошибок:

@user = User.find(params[:id])
@user.set_project_id(params[:wistia_project_ID])
unless @user.valid?
  @errors = @user.errors.full_messages
  render :show
end

ив представлении show:

<% if @errors  %>
  <p>THE FORM COULD NOT BE SAVED </p>
  <ul id='errors'>
  <% @errors.each do |error| %>
    <li><%= error %></li>
  <% end %>
  </ul>
<% end %>

Также обратите внимание, что я бы, вероятно, переименовал ваш метод set_project_id в set_project_id! (добавил удар), чтобы показать, что он мутирует ввод (изменяет свое внутреннее состояние)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...