Форум программистов, компьютерный форум, киберфорум
Наши страницы
Ruby on Rails
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Belzik
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 10
1

Обучающее задание по Rails

23.04.2016, 13:41. Просмотров 1015. Ответов 2
Метки нет (Все метки)

Помогите, пожалуйста, разобраться в рельсах. Сам проходил различные уроки по рельсам, а так же читал книгу "Rails 4. Гибкая разработка веб-приложений". Вообщем, пройдя уроки и прочитав книгу я решил, что этого хватит и нужно садиться кодить какие-то задания, ибо все-таки это самый эффективный способ научиться.
Задание такое: Сделать страницу которая будет разделена вертикально на две части. В левой части находятся форма ввода текста. В правой — текст «0 запросов» и история запросов. При нажатии на кнопку в левой части происходит передача на сервер текста, введённого в поле ввода (без перезагрузки страницы). Затем поле ввода очищается. На сервере создаётся новый экземпляр модели с этим текстом. В ответ от сервера приходит время создания этого экземпляра модели, которое (в любом формате) добавляется в div в правой части страницы. Так же обновляется текст сверху дива «N запросов», где N — количество запросов по кнопке, которое обработал сервер к данному моменту.
Так же спроектировал небольшую страничку: https://wireframe.cc/h6L3q7

Что реализовал я (под спойлером код и вопрос):
1)создал модель , мигрировал ее.
Кликните здесь для просмотра всего текста
Имя файла : 20160420140608_create_comments.rb
Ruby
1
2
3
4
5
6
7
8
9
class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :body
 
      t.timestamps null: false
    end
  end
end
Отсюда сразу вопрос, мне нужно реализовать так же время создание записи, есс это надо хранить в базе с той же записью, добавил я еще одну запись, начал мигрировать и ничего не произошло, как мне обновить таблицу в базе данных?
Изменял я файл так:
Ruby
1
2
3
4
5
6
7
8
9
10
class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :body
      t.string :data
 
      t.timestamps null: false
    end
  end
end


2)Маршруты, добавил ресурс.
Кликните здесь для просмотра всего текста
Имя файла: routes.rb
Ruby
1
2
3
Rails.application.routes.draw do
  resources :comments
end
Так же мне нужно будет реализовать подсчет обращений к базе данных. Как я понимаю, то лучше всего сделать либо отдельный файл со счетчиком, который можно вызывать и добавлять по 1му (где хранятся файлы в рельсах я так и не понял) или все-таки лучше создать отдельную таблицу со счетчиком и если ее создавать, то как мне связать две модели в одном контроллере, я так подозреваю, что это как делается в маршрутах.


3)Модель, добавил немного валидации.
Кликните здесь для просмотра всего текста

Имя файла: comment.rb
Ruby
1
2
3
4
class Comment < ActiveRecord::Base
  validates :body, presence: true,
                  length: { minimum: 1 }
end


4)Добавил стилей, чтобы разделить всё.
Кликните здесь для просмотра всего текста
Имя файла: comments.scss
Ruby
1
2
3
4
5
6
7
8
.create_comment {
  float: left;
  padding-left: 100px;
}
.show_comments {
  float: right;
  padding-right: 200px;
}
Тут вопросов нету.


Собственно начинается самое сложное для меня, на котором я запнулся и спотыкаюсь, и спотыкаюсь, и спотыкаюсь.
6)Мой контроллер + вьюха + javascript.
Кликните здесь для просмотра всего текста
Имя файла: comments_controller.rb
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class CommentsController < ApplicationController
  def index
    @comments = Comment.all
  end
 
 
 def create
  @comments = Comment.new(comments_params)
respond_to do |format|
  if @comments.save
    format.html { redirect_to comments_path(@comments) }
    format.js
  else
    @comments = Comment.all
    @msg_err = "Пожалуйста, заполните поле"
    format.html { render action: 'index' }
  end
end
  end
 
  private
  def comments_params
    params.require(:comments_make).permit(:body)
  end
end
Моя вьюха, имя файла: index.html.erb
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<div class="create_comment">
<h3><%= @msg_err %></h3>
<%= form_for :comments_make do |f| %>
  <p>
    <%= f.label :"Введите сюда свой комментарий" %><br>
    <%= f.text_area :body %>
  </p>
 
  <p>
    <%= f.submit :"Оставить свой комментарий", remote: true %>
  </p>
<% end %>
</div>
 
<div class="show_comments">
<h2>Все комментарии, которые есть в базе.</h2>
 
<table>
  <tr>
    <th>Содержание:</th>
  </tr>
 
  <% @comments.each do |comments| %>
    <tr>
      <td><%= comments.body %></td>
    </tr>
  <% end %>
</table>
</div>
Вьюха с JS кодом, которая лежит в одной папке с index.html.erb: create.js.erb
Ruby
1
$('.create_comment').append("<%= escape_javascript render(@comments) %>");
По поводу AJAX
Кликните здесь для просмотра всего текста

Вообщем вначале с сделал это всё без JS скрипта и, впринцепе, всё работало. Потом добавил несколько строчек, чтобы сделать AJAX и страничка не перегружалось, но страничка как перезагружалась так и перезагружается.
Ruby
1
2
3
<%= f.submit :"Оставить свой комментарий", remote: true %> # добавил для кнопки remote: true
    format.js # добавил в контроллере эту строчку
$('.create_comment').append("<%= escape_javascript render(@comments) %>"); # создал во вьюхах файл create.js.erb и добавил туда эту строчку

По поводу валидации:
Кликните здесь для просмотра всего текста

По поводу валидации, пытался сделать сообщение об ошибке, которые предлагают рельсы, но что-то не получилось, поэтому сделал просто сообщение об ошибке.
Пытался сделать вьюху такой:
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<div class="create_comment">
 
<%= form_for :comments_make do |f| %>
 
<% if @comments_err.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@comments_err.errors.count, "error") %> prohibited
        this article from being saved:
      </h2>
      <ul>
        <% @comments_err.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
 
  <p>
    <%= f.label :"Введите сюда свой комментарий" %><br>
    <%= f.text_area :body %>
  </p>
 
  <p>
    <%= f.submit :"Оставить свой комментарий", remote: true %>
  </p>
<% end %>
</div>
 
<div class="show_comments">
<h2>Все комментарии, которые есть в базе.</h2>
 
<table>
  <tr>
    <th>Содержание:</th>
  </tr>
 
  <% @comments.each do |comments| %>
    <tr>
      <td><%= comments.body %></td>
    </tr>
  <% end %>
</table>
</div>
А контроллер таким:
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class CommentsController < ApplicationController
  def index
    @comments = Comment.all
  end
 
 
 def create
  @comments = Comment.new(comments_params)
respond_to do |format|
  if @comments.save
    format.html { redirect_to comments_path(@comments) }
    format.js
  else
    @comments = Comment.all
    @comments_err = Comment.new
    format.html { render action: 'index' }
  end
end
  end
 
  private
  def comments_params
    params.require(:comments_make).permit(:body)
  end
end



Итоги: сделал страницу, в которой только поле и передается текст и выводится справа, но страница ОБНОВЛЯЕТСЯ (нужно сделать без), не реализовал время создания запросов, не сделал счетчик к базе данных.
Вообщем, вроде бы описал всё. Помогите, пожалуйста, разобраться. Приму любую критику.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2016, 13:41
Ответы с готовыми решениями:

Задание "сделай сам" из Гибкой разработки на Rails 4
Начала указанную в теме книгу Сэма Руби, Дейва Томаса и Дэвида Хэнссона. В конце второй главы есть...

Чтобы писать на Ruby on Rails - нужно учить Ruby потом Rails?
Чтобы выучить Ruby on Rails - нужно учить Ruby потом Rails?

Обучающее задания для Ruby
Добрый день. В Ruby я новичок, Есть такое задание: ввести адрес сайта, она должна скачать html...

Обучающее приложение
Здравствуйте. Есть задача: создать мобильное приложение с обучающим материалом (лекции и тесты)....

Посоветуйте обучающее приложение
Привет! Посоветуйте, плиз, русскоязычное обучающее приложение для Андроид по программированию...

2
j2FunOnly
Модератор
Эксперт JS
1062 / 956 / 537
Регистрация: 05.06.2015
Сообщений: 2,163
23.04.2016, 19:32 2
Лучший ответ Сообщение было отмечено Belzik как решение

Решение

По поводу AJAX
Повесьте remote: true не на submit, а на форму.
По поводу валидации:
Сделайте отдельное представление для варианта с ошибкой, т. е. app/views/comments/create_error.js.erb, и рендерьте его при неудачном создании коммента.

Чтобы не быть голословным, по-быстрому наскаффолдил:
app/models/comment.rb
Rails
1
2
3
4
class Comment < ActiveRecord::Base
  validates :body,
            presence: true
end

app/controllers/comments_controller.rb
Rails
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class CommentsController < ApplicationController
  before_action :set_comment, only: [:show, :edit, :update, :destroy]
 
  # GET /comments
  # GET /comments.json
  def index
    @comments = Comment.all
    @comment = Comment.new
  end
 
  # GET /comments/1
  # GET /comments/1.json
  def show
  end
 
  # GET /comments/new
  def new
    @comment = Comment.new
  end
 
  # GET /comments/1/edit
  def edit
  end
 
  # POST /comments
  # POST /comments.json
  def create
    @comment = Comment.new(comment_params)
 
    respond_to do |format|
      if @comment.save
        @comments_count = Comment.all.count
        format.html { redirect_to @comment, notice: 'Comment was successfully created.' }
        format.json { render :show, status: :created, location: @comment }
        format.js
      else
        format.html { render :new }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
        format.js { render :create_error }
      end
    end
  end
 
  # PATCH/PUT /comments/1
  # PATCH/PUT /comments/1.json
  def update
    respond_to do |format|
      if @comment.update(comment_params)
        format.html { redirect_to @comment, notice: 'Comment was successfully updated.' }
        format.json { render :show, status: :ok, location: @comment }
      else
        format.html { render :edit }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end
 
  # DELETE /comments/1
  # DELETE /comments/1.json
  def destroy
    @comment.destroy
    respond_to do |format|
      format.html { redirect_to comments_url, notice: 'Comment was successfully destroyed.' }
      format.json { head :no_content }
    end
  end
 
  private
    # Use callbacks to share common setup or constraints between actions.
    def set_comment
      @comment = Comment.find(params[:id])
    end
 
    # Never trust parameters from the scary internet, only allow the white list through.
    def comment_params
      params.require(:comment).permit(:body)
    end
end

app/views/commens/index.html.erb
Rails
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<p id="notice"><%= notice %></p>
 
<h1>Listing Comments.<small id="count">Total: <%= @comments.count %></small></h1>
 
<%= form_for @comment, remote: true do |f| %>
  <%= f.label :body %>
  <%= f.text_area :body %>
  <div id="error"></div>
  <%= f.submit %>
<% end %>
 
<table>
  <thead>
    <tr>
      <th>Body</th>
      <th colspan="3"></th>
    </tr>
  </thead>
 
  <tbody id='comments'>
    <% @comments.each do |comment| %>
      <tr>
        <td><%= "#{comment.created_at}:#{comment.body}" %></td>
        <td><%= link_to 'Show', comment %></td>
        <td><%= link_to 'Edit', edit_comment_path(comment) %></td>
        <td><%= link_to 'Destroy', comment, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>
 
<br>
 
<%= link_to 'New Comment', new_comment_path %>
app/views/comments/_comment.html.erb
Rails
1
2
3
4
5
6
<tr>
  <td><%= "#{comment.created_at}:#{comment.body}" %></td>
  <td><%= link_to 'Show', comment %></td>
  <td><%= link_to 'Edit', edit_comment_path(comment) %></td>
  <td><%= link_to 'Destroy', comment, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>

app/views/comments/create.js.erb
Rails
1
2
3
4
$('#comments').append("<%= escape_javascript render(@comment) %>")
$('#count').html("Total: <%= @comments_count %>")
$('#comment_body').val('')
$('#error').html('')

app/views/comments/create_error.js.erb
Rails
1
2
3
4
5
6
$('#error').html("<ul> \
      <% @comment.errors.full_messages.each do |message| %> \
        <li><%= message %></li> \
      <% end %> \
      </ul> \
")

не реализовал время создания запросов
Я просто вывел :created_at. Гуглите разницу типа полей timestamps и datetime...
1
Belzik
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 10
24.04.2016, 11:44  [ТС] 3
Спасибо за ответы, сейчас буду разбираться.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2016, 11:44

Обучающее видео по лиспу
Попробовал перо, так сказать. https://www.youtube.com/watch?v=WTnpQ_IYBkI&amp;feature=youtu.be ...

Обучающее приложение на Java
Доброго времени суток, вынужден просить помощи у данного сообщества. Необходимо создать Обучающую...

Разблокировать обучающее видео в формате swf.
При открытии обучающего видео в формате swf, появляется белый экран с надписью: Воспользуйтесь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru