share links to debate

This commit is contained in:
palomahnhp
2016-02-07 22:20:59 +01:00
parent 885182aa93
commit 2ee90ac76e
19 changed files with 226 additions and 13 deletions

View File

@@ -40,7 +40,7 @@ module CommentableActions
if @resource.save_with_captcha if @resource.save_with_captcha
track_event track_event
redirect_path = url_for(controller: controller_name, action: :show, id: @resource.id) redirect_path = after_create_path
redirect_to redirect_path, notice: t("flash.actions.create.#{resource_name.underscore}") redirect_to redirect_path, notice: t("flash.actions.create.#{resource_name.underscore}")
else else
load_categories load_categories
@@ -153,4 +153,8 @@ module CommentableActions
def index_customization def index_customization
nil nil
end end
def after_create_path
url_for(controller: controller_name, action: :show, id: @resource.id)
end
end end

View File

@@ -0,0 +1,26 @@
class DebateLinksController < ApplicationController
include CommentableActions
load_and_authorize_resource class: "Debate"
respond_to :html, :js
private
def create_params
params.require(:debate).permit(:title, :external_link, :tag_list, :terms_of_service, :captcha, :captcha_key)
end
def debate_params
params.require(:debate).permit(:title, :external_link, :tag_list, :terms_of_service, :captcha, :captcha_key)
end
def after_create_path
debate_path(@resource)
end
def resource_model
Debate
end
end

View File

@@ -26,7 +26,7 @@ class DebatesController < ApplicationController
private private
def debate_params def debate_params
params.require(:debate).permit(:title, :description, :tag_list, :terms_of_service, :captcha, :captcha_key) params.require(:debate).permit(:title, :description, :external_link, :tag_list, :terms_of_service, :captcha, :captcha_key)
end end
def resource_model def resource_model

View File

@@ -6,6 +6,10 @@ module Measurable
def title_max_length def title_max_length
@@title_max_length ||= self.columns.find { |c| c.name == 'title' }.limit || 80 @@title_max_length ||= self.columns.find { |c| c.name == 'title' }.limit || 80
end end
def external_link_max_length
@@external_link_max_length ||= self.columns.find { |c| c.name == 'external_link' }.limit || 100
end
def responsible_name_max_length def responsible_name_max_length
@@responsible_name_max_length ||= self.columns.find { |c| c.name == 'responsible_name' }.limit || 60 @@responsible_name_max_length ||= self.columns.find { |c| c.name == 'responsible_name' }.limit || 60

View File

@@ -18,11 +18,16 @@ class Debate < ActiveRecord::Base
has_many :comments, as: :commentable has_many :comments, as: :commentable
validates :title, presence: true validates :title, presence: true
validates :description, presence: true validates :description, presence: true, :if => :description_required?
validates :author, presence: true validates :author, presence: true
validates :title, length: { in: 4..Debate.title_max_length } validates :title, length: { in: 4..Debate.title_max_length }
validates :description, length: { in: 10..Debate.description_max_length } validates :description, length: { in: 10..Debate.description_max_length }, :if => :description_required?
validates :external_link, :presence => true,
length: { in: 10..Debate.external_link_max_length },
format: { with: /https?:\/\/*/},
:if => :link_required?
validates :terms_of_service, acceptance: { allow_nil: false }, on: :create validates :terms_of_service, acceptance: { allow_nil: false }, on: :create
@@ -126,4 +131,20 @@ class Debate < ActiveRecord::Base
self.tags.each{ |t| t.increment_custom_counter_for('Debate') } self.tags.each{ |t| t.increment_custom_counter_for('Debate') }
end end
def description_required?
if self.external_link == nil
return true
else
return false
end
end
def link_required?
if self.external_link == nil
return false
else
return true
end
end
end end

View File

@@ -0,0 +1,42 @@
<%= form_for @debate,url: debate_links_path, :method => :post do |f| %>
<%= render 'shared/errors', resource: @debate %>
<div class="row">
<div class="small-12 column">
<%= f.label :title, t("debates.form.debate_title") %>
<%= f.text_field :title, maxlength: Debate.title_max_length, placeholder: t("debates.form.debate_title"), label: false, data: {js_suggest_result: "js_suggest_result", js_suggest: "#js-suggest", js_url: suggest_debates_path}%>
</div>
<div id="js-suggest"></div>
<div class="small-12 column">
<%= f.label :external_link, t("debate_links.form.debate_link") %>
<%= f.text_field :external_link, maxlength: Debate.title_max_length, placeholder: t("debate_links.form.debate_link"), label: false %>
</div>
<div class="small-12 column">
<%= f.label :tag_list, t("debates.form.tags_label") %>
<p class="note"><%= t("debates.form.tags_instructions") %></p>
<%= f.text_field :tag_list, value: @debate.tag_list.to_s,
label: false,
placeholder: t("debates.form.tags_placeholder") %>
</div>
<div class="small-12 column">
<% if @debate.new_record? %>
<%= f.label :terms_of_service do %>
<%= f.check_box :terms_of_service, label: false %>
<span class="checkbox">
<%= t("form.accept_terms",
policy: link_to(t("form.policy"), "/privacy", target: "blank"),
conditions: link_to(t("form.conditions"), "/conditions", target: "blank")).html_safe %>
</span>
<% end %>
<% end %>
</div>
<div class="small-12 column">
<%= f.simple_captcha input_html: { required: false } %>
</div>
<div class="actions small-12 column">
<%= f.submit(class: "button radius", value: t("debate_links.#{action_name}.form.submit_button")) %>
</div>
</div>
<% end %>

View File

@@ -0,0 +1,29 @@
<div class="debate-new row">
<div class="small-12 medium-9 column">
<%= link_to debates_path, class: "left back" do %>
<i class="icon-angle-left left"></i>
<%= t("debates.new.back_link") %>
<% end %>
<h1><%= t("debate_links.new.start_new") %></h1>
<div class="alert-box info radius">
<%= t("debates.new.info",
info_link: link_to(t("debates.new.info_link"), new_proposal_path )).html_safe %>
<%= link_to "/more_information", target: "_blank" do %>
<strong><%= t("debates.new.more_info")%></strong>
<% end %>
</div>
<%= render "form" %>
</div>
<div class="small-12 medium-3 column">
<i class="icon-debates right"></i>
<h2><%= t("debate_links.new.recommendations_title") %></h2>
<ul class="recommendations">
<li><%= t("debates.new.recommendation_one") %></li>
<li><%= t("debates.new.recommendation_two") %></li>
<li><%= t("debates.new.recommendation_three") %></li>
<li><%= t("debates.new.recommendation_four") %></li>
</ul>
</div>
</div>

View File

@@ -0,0 +1 @@
<%= render "shared/suggest" %>

View File

@@ -41,7 +41,12 @@
</p> </p>
<div class="debate-description"> <div class="debate-description">
<%= link_to debate.description, debate %> <% if debate.description.present? %>
<%= link_to debate.description, debate %>
<% end %>
<% if debate.external_link.present? %>
<%= link_to debate.external_link, debate.external_link, target: '_blank' %>
<% end %>
<div class="truncate"></div> <div class="truncate"></div>
</div> </div>
<%= render "shared/tags", taggable: debate, limit: 5 %> <%= render "shared/tags", taggable: debate, limit: 5 %>

View File

@@ -6,11 +6,17 @@
<%= f.text_field :title, maxlength: Debate.title_max_length, placeholder: t("debates.form.debate_title"), label: false, data: {js_suggest_result: "js_suggest_result", js_suggest: "#js-suggest", js_url: suggest_debates_path}%> <%= f.text_field :title, maxlength: Debate.title_max_length, placeholder: t("debates.form.debate_title"), label: false, data: {js_suggest_result: "js_suggest_result", js_suggest: "#js-suggest", js_url: suggest_debates_path}%>
</div> </div>
<div id="js-suggest"></div> <div id="js-suggest"></div>
<div class="ckeditor small-12 column"> <% if @debate.external_link != nil %>
<%= f.label :description, t("debates.form.debate_text") %> <div class="small-12 column">
<%= f.cktext_area :description, maxlength: Debate.description_max_length, ckeditor: { language: I18n.locale }, label: false %> <%= f.label :external_link, t("debate_links.form.debate_link") %>
</div> <%= f.text_field :external_link, maxlength: Debate.external_link_max_length, placeholder: t("debates.form.debate_title"), label: false %>
</div>
<% else %>
<div class="ckeditor small-12 column">
<%= f.label :description, t("debates.form.debate_text") %>
<%= f.cktext_area :description, maxlength: Debate.description_max_length, ckeditor: { language: I18n.locale }, label: false %>
</div>
<% end %>
<div class="small-12 column"> <div class="small-12 column">
<%= f.label :tag_list, t("debates.form.tags_label") %> <%= f.label :tag_list, t("debates.form.tags_label") %>
<p class="note"><%= t("debates.form.tags_instructions") %></p> <p class="note"><%= t("debates.form.tags_instructions") %></p>

View File

@@ -44,6 +44,7 @@
<div class="small-12 medium-3 column"> <div class="small-12 medium-3 column">
<aside class="sidebar" role="complementary"> <aside class="sidebar" role="complementary">
<%= link_to t("debates.index.start_debate"), new_debate_path, class: 'button radius expand' %> <%= link_to t("debates.index.start_debate"), new_debate_path, class: 'button radius expand' %>
<%= link_to t("debates.index.share_debate"), debate_links_new_path, class: 'button radius expand' %>
<%= render "shared/tag_cloud", taggable: 'debate' %> <%= render "shared/tag_cloud", taggable: 'debate' %>
</aside> </aside>
</div> </div>

View File

@@ -34,7 +34,13 @@
</span> </span>
</div> </div>
<%= safe_html_with_links @debate.description %> <% if @debate.external_link.present? %>
<%= safe_html_with_links link_to @debate.external_link, @debate.external_link, target: '_blank'%>
<% end %>
<% if @debate.description.present? %>
<%= safe_html_with_links @debate.description %>
<% end %>
<%= render 'shared/tags', taggable: @debate %> <%= render 'shared/tags', taggable: @debate %>

View File

@@ -108,6 +108,7 @@ en:
select_order: Order by select_order: Order by
start_debate: Start a debate start_debate: Start a debate
title: Debates title: Debates
share_debate: "Share a link"
new: new:
back_link: Go back back_link: Go back
form: form:
@@ -136,6 +137,17 @@ en:
update: update:
form: form:
submit_button: Save changes submit_button: Save changes
debate_links:
form:
debate_link: "Link"
new:
start_new: "Share a link"
recommendations_title: "Recommendations for sharing a link"
form:
submit_button: "Share link"
create:
form:
submit_button: "Share link"
errors: errors:
messages: messages:
user_not_found: User not found user_not_found: User not found

View File

@@ -109,6 +109,7 @@ es:
select_order: Ordenar por select_order: Ordenar por
start_debate: Empieza un debate start_debate: Empieza un debate
title: Debates title: Debates
share_debate: "Comparte un enlace"
new: new:
back_link: Volver back_link: Volver
form: form:
@@ -137,6 +138,17 @@ es:
update: update:
form: form:
submit_button: Guardar cambios submit_button: Guardar cambios
debate_links:
form:
debate_link: "Enlace"
new:
start_new: "Compartir un enlace"
recommendations_title: "Recomendaciones para compartir un enlace"
form:
submit_button: "Comparte un enlace"
create:
form:
submit_button: "Comparte un enlace"
errors: errors:
messages: messages:
user_not_found: No se encontró el usuario user_not_found: No se encontró el usuario

View File

@@ -43,6 +43,9 @@ Rails.application.routes.draw do
get :suggest get :suggest
end end
end end
get 'debate_links/new' => 'debate_links#new'
post 'debate_links' => 'debate_links#create'
resources :proposals do resources :proposals do
member do member do

View File

@@ -0,0 +1,5 @@
class AddExternalLinkToDebates < ActiveRecord::Migration
def change
add_column :debates, :external_link, :string, limit: 100
end
end

View File

@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160204134022) do ActiveRecord::Schema.define(version: 20160207205252) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@@ -118,9 +118,9 @@ ActiveRecord::Schema.define(version: 20160204134022) do
t.integer "cached_votes_score", default: 0 t.integer "cached_votes_score", default: 0
t.integer "hot_score", limit: 8, default: 0 t.integer "hot_score", limit: 8, default: 0
t.integer "confidence_score", default: 0 t.integer "confidence_score", default: 0
t.string "external_link", limit: 100
t.integer "geozone_id" t.integer "geozone_id"
t.tsvector "tsv" t.tsvector "tsv"
t.string "external_link", limit: 100
end end
add_index "debates", ["author_id", "hidden_at"], name: "index_debates_on_author_id_and_hidden_at", using: :btree add_index "debates", ["author_id", "hidden_at"], name: "index_debates_on_author_id_and_hidden_at", using: :btree

View File

@@ -86,6 +86,24 @@ feature 'Debates' do
expect(page).to have_content I18n.l(Debate.last.created_at.to_date) expect(page).to have_content I18n.l(Debate.last.created_at.to_date)
end end
scenario 'Create_link' do
author = create(:user)
login_as(author)
visit debate_links_new_path
fill_in 'debate_title', with: 'A title for a debate'
fill_in 'debate_external_link', with: 'http://localhost:3000'
fill_in 'debate_captcha', with: correct_captcha_text
check 'debate_terms_of_service'
click_button 'Share link'
expect(page).to have_content 'A title for a debate'
expect(page).to have_content 'Debate created successfully.'
expect(page).to have_content author.name
expect(page).to have_content I18n.l(Debate.last.created_at.to_date)
end
scenario 'Captcha is required for debate creation' do scenario 'Captcha is required for debate creation' do
login_as(create(:user)) login_as(create(:user))

View File

@@ -30,6 +30,24 @@ describe Debate do
end end
end end
describe "#external_link" do
it "should not be valid without a url" do
debate.external_link = ""
expect(debate).to_not be_valid
end
it "should not be valid when very short" do
debate.external_link = "abc"
expect(debate).to_not be_valid
end
it "should not be valid when very long" do
debate.external_link = "a" * 101
expect(debate).to_not be_valid
end
end
describe "#description" do describe "#description" do
it "should not be valid without a description" do it "should not be valid without a description" do
debate.description = nil debate.description = nil