Merge pull request #4 from E2S2015/Branch1

Branch1
This commit is contained in:
thedreamwork 2016-01-06 19:14:03 +08:00
commit 86af01ae3b
44 changed files with 713 additions and 17 deletions

10
Gemfile
View File

@ -1,4 +1,4 @@
source 'https://rubygems.org' source 'https://ruby.taobao.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
@ -26,7 +26,7 @@ gem 'settingslogic'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks' gem 'turbolinks'
# Use jquery as the JavaScript library # Use jquery as the JavaScript library
gem 'jquery-rails' #gem 'jquery-rails'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0' gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api. # bundle exec rake doc:rails generates the API under doc/api.
@ -38,9 +38,9 @@ gem 'bootstrap-sass'
gem 'font-awesome-sass-rails', '~> 3.0.2.2' gem 'font-awesome-sass-rails', '~> 3.0.2.2'
gem 'twitter-bootstrap-rails-confirm', github: 'fxhover/twitter-bootstrap-rails-confirm', branch: 'bootstrap3' gem 'twitter-bootstrap-rails-confirm', github: 'fxhover/twitter-bootstrap-rails-confirm', branch: 'bootstrap3'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks' #gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0' #gem 'jbuilder', '~> 2.0'
# Use ActiveModel has_secure_password # Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7' gem 'bcrypt', '~> 3.1.7'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
@ -68,6 +68,6 @@ group :development, :test do
gem 'web-console', '~> 2.0' gem 'web-console', '~> 2.0'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring' #gem 'spring'
end end

View File

@ -12,7 +12,7 @@ GIT
markdown-toolbar (1.0.1) markdown-toolbar (1.0.1)
GEM GEM
remote: https://rubygems.org/ remote: https://ruby.taobao.org/
specs: specs:
actionmailer (4.2.3) actionmailer (4.2.3)
actionpack (= 4.2.3) actionpack (= 4.2.3)
@ -227,4 +227,4 @@ DEPENDENCIES
web-console (~> 2.0) web-console (~> 2.0)
BUNDLED WITH BUNDLED WITH
1.10.6 1.11.2

73
Gemfile~ Normal file
View File

@ -0,0 +1,73 @@
source 'https://ruby.taobao.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.3'
# Use mysql as the database for Active Record
gem 'mysql2'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby
# Use jquery as the JavaScript library
gem 'jquery-rails'
#Use kaminari page
gem 'kaminari'
#Use settingslogic
gem 'settingslogic'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Use jquery as the JavaScript library
#gem 'jquery-rails'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0', group: :doc
# Use haml template
gem 'haml-rails'
# Use bootstrap css
gem 'bootstrap-sass'
gem 'font-awesome-sass-rails', '~> 3.0.2.2'
gem 'twitter-bootstrap-rails-confirm', github: 'fxhover/twitter-bootstrap-rails-confirm', branch: 'bootstrap3'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
#gem 'jbuilder', '~> 2.0'
# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring', group: :development
# Use Unicorn as the app server
# gem 'unicorn'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
group :development do
gem 'thin'
end
#Avatar
gem 'gravatar_image_tag'
#markdown
gem 'markdown-toolbar', git: 'https://github.com/fuksito/markdown-toolbar.git'
gem 'redcarpet'
gem 'simple_fileupload'
gem 'remotipart'
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug'
# Access an IRB console on exception pages or by using <%= console %> in views
gem 'web-console', '~> 2.0'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
#gem 'spring'
end

View File

@ -1,19 +1,58 @@
class ArticlesController < ApplicationController class ArticlesController < ApplicationController
def index def index
res = Article
order = 'updated_at desc'
if params[:sort].present?
order = case params[:sort]
when 'star'
'star_count desc'
when 'comments'
'comments_count desc'
else
'updated_at desc'
end
end
if params[:c].present?
category = Category.find params[:c]
res = res.where("category_id=#{category.id}") if category
end
res = res.where("title like ?", "%#{params[:keyword]}%") if params[:keyword].present?
@articles = res.order(order).page(params[:page]).per(Settings.blog.aritcle_page_size)
respond_to do |format|
format.html
format.js
end
end end
def new def new
@article = Article.new
end end
def create def create
@article = Article.new params.require(:article).permit(:title, :tags, :source, :content)
@article.user_id = @current_user.id
if params[:article].present? && params[:article][:category_id].present?
@article.category_id = params[:article][:category_id]
elsif params[:article].present? && params[:article][:category_name].present?
category = Category.find_or_create params[:article][:category_name]
@article.category_id = category.id
end
if @article.save
redirect_to article_path(@article)
else
render 'new'
end
end end
def show def show
@article.add_view request.remote_ip, @current_user, params.inspect
@comment = @article.comments.new
@comments = @article.comments.order('updated_at asc').page(params[:page]).per(Settings.blog.comments_page_size)
respond_to do |format|
format.html
format.js
end
end end
def edit def edit
@ -21,24 +60,52 @@ class ArticlesController < ApplicationController
end end
def update def update
attributes = params.require(:article).permit(:title, :tags, :source, :content)
if params[:article].present? && params[:article][:category_id].present?
attributes[:category_id] = params[:article][:category_id]
elsif params[:article].present? && params[:article][:category_name].present?
category = Category.find_or_create params[:article][:category_name]
attributes[:category_id] = category.id
end
if @article.update_attributes attributes
redirect_to article_path(@article)
else
render 'edit'
end
end end
def destroy def destroy
if @article.destroy
redirect_to articles_path
else
flash[:error] = '删除失败'
redirect_to article_path(@article)
end
end end
def star def star
if current_user_can_star? @article
@result = {status: false, message: '', star_count: 0}
star = @article.article_stars.new user_id: @current_user.id
if star.save
@result[:star_count] = (@article.star_count || 0) + 1
@result[:status] = true
else
@result[:message] = '称赞失败'
end
respond_to do |format|
format.js
end
end
end end
protected protected
def check_current_user_is_admin def check_current_user_is_admin
redirect_to root_path unless (@current_user && @current_user.admin)
end end
def article def article
@article = Article.find params[:id]
end end
end end

View File

@ -0,0 +1,111 @@
class ArticlesController < ApplicationController
def index
res = Article
order = 'updated_at desc'
if params[:sort].present?
order = case params[:sort]
when 'star'
'star_count desc'
when 'comments'
'comments_count desc'
else
'updated_at desc'
end
end
if params[:c].present?
category = Category.find params[:c]
res = res.where("category_id=#{category.id}") if category
end
res = res.where("title like ?", "%#{params[:keyword]}%") if params[:keyword].present?
@articles = res.order(order).page(params[:page]).per(Settings.blog.aritcle_page_size)
respond_to do |format|
format.html
format.js
end
end
def new
@article = Article.new
end
def create
@article = Article.new params.require(:article).permit(:title, :tags, :source, :content)
@article.user_id = @current_user.id
if params[:article].present? && params[:article][:category_id].present?
@article.category_id = params[:article][:category_id]
elsif params[:article].present? && params[:article][:category_name].present?
category = Category.find_or_create params[:article][:category_name]
@article.category_id = category.id
end
if @article.save
redirect_to article_path(@article)
else
render 'new'
end
end
def show
@article.add_view request.remote_ip, @current_user, params.inspect
@comment = @article.comments.new
@comments = @article.comments.order('updated_at asc').page(params[:page]).per(Settings.blog.comments_page_size)
respond_to do |format|
format.html
format.js
end
end
def edit
end
def update
attributes = params.require(:article).permit(:title, :tags, :source, :content)
if params[:article].present? && params[:article][:category_id].present?
attributes[:category_id] = params[:article][:category_id]
elsif params[:article].present? && params[:article][:category_name].present?
category = Category.find_or_create params[:article][:category_name]
attributes[:category_id] = category.id
end
if @article.update_attributes attributes
redirect_to article_path(@article)
else
render 'edit'
end
end
def destroy
if @article.destroy
redirect_to articles_path
else
flash[:error] = '删除失败'
redirect_to article_path(@article)
end
end
def star
if current_user_can_star? @article
@result = {status: false, message: '', star_count: 0}
star = @article.article_stars.new user_id: @current_user.id
if star.save
@result[:star_count] = (@article.star_count || 0) + 1
@result[:status] = true
else
@result[:message] = '称赞失败'
end
respond_to do |format|
format.js
end
end
end
protected
def check_current_user_is_admin
redirect_to root_path unless (@current_user && @current_user.admin)
end
def article
end
end

View File

@ -12,5 +12,20 @@ class Article < ActiveRecord::Base
validates :content, length: {minimum: 10} validates :content, length: {minimum: 10}
validate :validate_category validate :validate_category
def validate_category
errors.add(:category_id, '分类不正确') unless Category.find(self.category_id)
rescue
errors.add(:category_id, '分类不正确')
return false
else
return true
end
def add_view(ip, current_user, param_string)
return false if (self.article_views.where("created_at >= '#{DateTime.now - 10.minute}' and ip='#{ip}'").count > 0)
view = self.article_views.new ip: ip, param_string: param_string
view.user_id = current_user.id if current_user
view.save
end
end end

16
app/models/article.rb~ Normal file
View File

@ -0,0 +1,16 @@
class Article < ActiveRecord::Base
attr_accessor :category_name
belongs_to :category, counter_cache: 'articles_count'
belongs_to :user
has_many :article_stars
has_many :article_views
has_many :comments, class_name: 'ArticleComment'
validates :title, length: {minimum: 10, maximum: 50}
validates :tags, presence: true
validates :source, allow_blank: true, format: {with: /[a-zA-Z0-9-]+\.[a-zA-Z0-9]+/}
validates :content, length: {minimum: 10}
validate :validate_category
end

View File

@ -0,0 +1,25 @@
.article_content
%h3
- if article.source.empty?
[原创]
= link_to article.title, article_path(article), target: '_blank'
- get_tags(article).each do |tag|
%span.label.label-default
= tag
%p
%span.icon.icon-time(data-toggle="tooltip" data-placement="bottom" title="发表时间")
= article.updated_at.strftime('%Y-%m-%d')
%span.icon.icon-eye-open(data-toggle="tooltip" data-placement="bottom" title="浏览数")
= article.view_count || 0
%span.icon.icon-thumbs-up(data-toggle="tooltip" data-placement="bottom" title="称赞数")
= article.star_count || 0
%span.icon.icon-comments(data-toggle="tooltip" data-placement="bottom" title="评论数")
= article.comments_count || 0
- unless article.source.empty?
%p
转载:
= article.source
.row-fluid.article_des
%p
= article.content[0..300]

View File

View File

@ -0,0 +1,15 @@
.text-left.ui-sortable
%h4 文章分类
%ul.nav.bs-docs-sidenav
%li
= link_to articles_path, remote: true do
全部
%span.badge
= "#{get_articles_count}篇"
- get_categories.each do |category|
%li
= link_to articles_path(c: category.id), remote: true do
= category.name
%span.badge
= "#{category.articles_count || 0}篇"

View File

@ -0,0 +1,7 @@
- unless @articles.present?
.jumbotron
%h2 什么也没有~
- @articles.each do |article|
= render partial: 'articles/article', locals: {article: article}
= paginate @articles, remote: true if params[:controller] == 'articles'

View File

View File

@ -0,0 +1,18 @@
.panel.panel-dfault{id: "comment_#{comment.id}"}
.panel-body
.row
.col-md-1.text-center
%span.comment_avatar
= avatar comment.user
= comment.user.nickname
.comment_content.col-md-9{id: "comment_#{comment.id}_body"}
= raw markdown_parser(comment.content)
.row.comment_footer.text-right
%span.icon.icon-time(data-toggle="tooltip" data-placement="bottom" title="评论时间")
= "#{comment.updated_at.strftime('%Y-%m-%d %H:%M:%S')}"
- if current_user_can_edit_comment?(comment)
= link_to edit_article_comment_path(@article, comment), remote: true do
%span.icon.icon-edit
- if current_user_is_admin? || current_user_can_edit_comment?(comment)
= link_to article_comment_path(@article, comment), method: 'delete', remote: true, "data-confirm"=> '确定删除吗?' do
%span.icon.icon-trash

View File

View File

@ -0,0 +1,25 @@
= render partial: 'toolbar_upload_img', locals: {text_id: 'article_comment_content'}
.comment_form
- url = @comment.new_record? ? article_comments_path(@article) : article_comment_path(@article, @comment)
= form_for @comment, url: url, role: 'form', remote: true do |f|
.form-group
%ul.nav.nav-tabs#preview_tab{role: "tablist"}
%li.active
= link_to (@comment.new_record? ? '发表评论' : '编辑评论'), '#edit', role: 'tab', 'data-toggle'=>'tab'
%li
= link_to '预览', '#preview', role: 'tab', 'data-toggle'=>'tab'
.tab-content
.tab-pane.active#edit
= f.text_area :content, placeholder: '评论内容', class: 'form-control'
.tab-pane#preview
.form-group
= f.submit '提交', class: 'btn btn-success btn-lg btn-block'
:javascript
$(function(){
$('#preview_tab a[href="#preview"]').click(function(e){
e.preventDefault();
$(this).tab('show');
preview('article_comment_content', 'preview');
});
});

View File

@ -0,0 +1,7 @@
- unless @comments.present?
.jumbotron#no_comments
%h2 还没有评论~
- @comments.each do |comment|
= render partial: 'comment', locals: {comment: comment}
#paginate
= paginate @comments, remote: true

View File

View File

@ -0,0 +1,11 @@
- errors = @article.errors.full_messages
- if errors.any?
.alert.alert-danger
%a.close{"data-dismiss"=>"alert"} &times;
%span
= errors.first
- elsif flash[:error].present?
.alert.alert-danger
%a.close{"data-dismiss"=>"alert"} &times;
%span
= flash[:error]

View File

View File

@ -0,0 +1,39 @@
= render partial: 'toolbar_upload_img', locals: {text_id: 'article_content'}
= form_for @article, role: 'form' do |f|
.form-group
%label{for: 'article_title'} 文章标题
= f.text_field :title, placeholder: '文章标题', class: 'form-control'
.form-group
%label{for: 'article_category_id'} 文章分类
= select_tag "article[category_id]", options_for_select(get_categories_options, @article.category_id), include_blank: true, class: 'form-control'
或者新建一个分类:
= f.text_field :category_name, placeholder: '分类名称', class: 'form-control'
.form-group
%label{for: 'article_tags'} 标签
= f.text_field :tags, placeholder: '文章标签,多个用英文“,”隔开', class: 'form-control'
.form-group
%label{for: 'article_source'} 文章来源
= f.text_field :source, placeholder: '文章来源,为空则为原创', class: 'form-control'
.form-group
%ul.nav.nav-tabs#preview_tab{role: "tablist"}
%li.active
= link_to '文章内容', '#edit', role: 'tab', 'data-toggle'=>'tab'
%li
= link_to '预览', '#preview', role: 'tab', 'data-toggle'=>'tab'
.tab-content
.tab-pane.active#edit
= f.text_area :content, placeholder: '文章内容', class: 'form-control'
.tab-pane#preview
.form-group
= f.submit '提交', class: 'btn btn-success btn-lg btn-block'
:javascript
$(function(){
$('#preview_tab a[href="#preview"]').click(function(e){
e.preventDefault();
$(this).tab('show');
preview('article_content', 'preview');
});
});

View File

View File

@ -0,0 +1,32 @@
= form_for :upload, url: upload_img_blogs_path, enctype: "multipart/form-data", class: 'form-horizontal', role: 'form', remote: true do |f|
.modal.fade#upload_modal
.modal-dialog
.modal-content
.modal-header
%button.close{"data-dismiss"=>"modal"}
%span{"aria-hidden"=>"true"}
&times;
%span.sr-only
Close
%h4 上传图片
.modal-body
.form-group.row.text-center
.error.text-center#error
%label.col-sm-2.control-label.text-right{for: "upload_img"} 图片:
.col-sm-8.text-left
= token_tag
= f.hidden_field :text_id, value: text_id
= f.file_field :img
.modal-footer
%button.btn.btn-default{"data-dismiss"=>"modal"} 关闭
= submit_tag '上传', class: 'btn btn-primary'
:javascript
$(function(){
new MarkdownToolbar($('##{text_id}'));
$('.mdt_button_image').unbind('click');
$('.mdt_button_image').click(function(){
$('#upload_modal').modal('show');
});
});

View File

@ -0,0 +1,3 @@
%h3 编辑博文
= render partial: 'error'
= render partial: 'form'

View File

View File

@ -0,0 +1,26 @@
.row.inner.edge
.col-md-9.layout-main
.tab-nav
-# %h2.common-title 博文列表
%nav.sub-tab.row
%span.col-md-6.text-left
%h3 文章列表
%span.col-md-6.text-right.sort_navbar
- params_hash = params.dup
- params_hash.delete :page
%span.icon.icon-circle-arrow-down(data-toggle="tooltip" data-placement="bottom" title="排序")
= link_to '按时间', articles_path(params_hash.merge({sort: 'time'})), remote: true, class: "#{'current' if params[:sort].nil? || params[:sort] == 'time'}"
= link_to '按称赞', articles_path(params_hash.merge({sort: 'star'})), remote: true, class: "#{'current' if params[:sort].present? && params[:sort] == 'star'}"
= link_to '按评论', articles_path(params_hash.merge({sort: 'comments'})), remote: true, class: "#{'current' if params[:sort].present? && params[:sort] == 'comments'}"
.article-list#article-list
= render partial: 'articles'
.sidebar.col-md-3.layout-secondary.hidden-xs.hidden-sm
= render partial: 'article_sidebar'
:javascript
$(function(){
$('.sort_navbar a').click(function(){
$(this).addClass('current').siblings().removeClass('current');
});
});

View File

View File

@ -0,0 +1,2 @@
:plain
$('#article-list').html("#{escape_javascript(render partial: 'articles')}");

View File

View File

@ -0,0 +1,4 @@
%h3 撰写博文
= render partial: 'error'
= render partial: 'form'

View File

View File

@ -0,0 +1,57 @@
.article_show
= render partial: 'error'
%h3.article-title
- if @article.source.empty?
[原创]
= @article.title
- if current_user_is_admin?
= link_to edit_article_path(@article) do
%span.icon.icon-edit
= link_to article_path(@article), method: 'delete', "data-confirm"=> "确定删除吗?" do
%span.icon.icon-trash
%p
- get_tags(@article).each do |tag|
%span.label.label-default
= tag
%p
%span.icon
分类:
= link_to @article.category.name, articles_path(c: @article.category_id)
%span.icon.icon-time(data-toggle="tooltip" data-placement="bottom" title="发表时间")
= @article.updated_at.strftime('%Y-%m-%d %H:%M')
%span.icon.icon-eye-open(data-toggle="tooltip" data-placement="bottom" title="浏览")
= @article.view_count || 1
- if current_user_can_star?(@article)
= link_to star_article_path(@article), method: :post, remote: 'true' do
%span.icon.icon-thumbs-up#article_star(data-toggle="tooltip" data-placement="bottom" title="称赞")
= @article.star_count || 0
- else
%span.icon.icon-thumbs-up(data-toggle="tooltip" data-placement="bottom" title="称赞数")
= @article.star_count || 0
%span.icon.icon-comments(data-toggle="tooltip" data-placement="bottom" title="评论")
= @article.comments_count || 0
- unless @article.source.empty?
%p
转载:
= @article.source
.panel.panel-dfault
.panel-body
%p
= raw markdown_parser(@article.content)
%h3 评论:
#comments_content
= render partial: 'comments'
- if is_logined?
#comment_form
= render partial: 'comment_form'
- else
.jumbotron
%h2
= link_to '登录', login_path
后可评论

View File

View File

@ -0,0 +1,2 @@
:plain
$('#comments_content').html("#{escape_javascript(render partial: 'comments')}");

View File

View File

@ -0,0 +1,4 @@
- if @result[:status]
:plain
$('#article_star').html(" #{@result[:star_count]}");
$('#article_star').parent('a').attr('href', 'javascript:void(0);').addClass('disabled');

View File

View File

@ -0,0 +1 @@
6a220677438f874ca75763b1525ada21139d0f3a30f25b929d33222bef3bd8a0368bc03e87d1b495e2aedd297398bf470c693318bed3c72a27be5b31725aab0b

22
config/secrets.yml.example Executable file
View File

@ -0,0 +1,22 @@
# Be sure to restart your server when you modify this file.
# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
# You can use `rake secret` to generate a secure secret key.
# Make sure the secrets in this file are kept private
# if you're sharing your code publicly.
development:
secret_key_base: eef518ad815fbd36abb4a59e5ef6316f4ba52c1108b7bd78682354174108979016f101eecfcd2d6b6543a7b5795e73b17c4fc27d69146dd864445b6e6a0bfd08
test:
secret_key_base: 38e245a613b00c6701f3525867eb0c2e0b9d8f1395d54a2d7a3c1e3f35480fa331272f5cf1a74a130a60ed922131a00851c09a5819330652cd73e85378d0ca0a
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

22
config/secrets.yml.example~ Executable file
View File

@ -0,0 +1,22 @@
# Be sure to restart your server when you modify this file.
# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
# You can use `rake secret` to generate a secure secret key.
# Make sure the secrets in this file are kept private
# if you're sharing your code publicly.
development:
secret_key_base: 6938efe794286cdef1a2929153f78aa17f3005ab4e671e0ba21bf09057b448152f1725ca939d77d392bec467487e40e4d7e9e9ed9ba785e746e80c5dea106e0e
test:
secret_key_base: 38e245a613b00c6701f3525867eb0c2e0b9d8f1395d54a2d7a3c1e3f35480fa331272f5cf1a74a130a60ed922131a00851c09a5819330652cd73e85378d0ca0a
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

View File

@ -0,0 +1,46 @@
require 'test_helper'
require 'articles_controller'
class ArticlesControllerTest < ActionController::TestCase
setup do
@controller = ArticlesController.new
@ariticle = Article.new
@ariticle.title = 'title1'
@ariticle.tags = 'tags1'
@ariticle.source = 'source1'
@ariticle.content = 'content1'
@ariticle.save
end
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:articles)
end
test "should show article" do
get :show, id: @article.id
assert_response :success
end
test "should create article" do
post :create,:article =>{:title=>'title1', :tags=>'tags1', :source=>'source', :content=>'content1'}
assert_not_nil session[:article_id]
assert_redirected_to article_path(@article)
end
test "should destroy article" do
assert_difference('Article.count', -1) do
delete :destroy, id: @article.id
end
assert_redirected_to articles_path
end
test "destroy_wrong" do
post :destroy, :article=>{:username=>'title1'}
assert_response :success
assert_equal '删除失败', flash[:error]
end
end

View File

@ -0,0 +1,46 @@
require 'test_helper'
require 'articles_controller'
class ArticlesControllerTest < ActionController::TestCase
setup do
@controller = AriticlesController.new
@ariticle = Ariticle.new
@ariticle.title = 'title1'
@ariticle.tags = 'tags1'
@ariticle.source = 'source1'
@ariticle.content = 'content1'
@ariticle.save
end
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:articles)
end
test "should show article" do
get :show, id: @ariticle.id
assert_response :success
end
test "should create ariticle" do
post :create,:ariticle =>{:title=>'title1', :tags=>'tags1', :source=>'source', :content=>'content1'}
assert_not_nil session[:ariticle_id]
assert_redirected_to article_path(@ariticle)
end
test "should destroy article" do
assert_difference('Article.count', -1) do
delete :destroy, id: @article.id
end
assert_redirected_to articles_path
end
test "destroy_wrong" do
post :destroy, :ariticle=>{:username=>'title1'}
assert_response :success
assert_equal '删除失败', flash[:error]
end
end