I have the following code which is working for the most part. However I do get error msg's that it can't save because the mail address already exists. How is that possible when I do a destroy_all first?
My guess: there are multiple rows with the same mail address (that is true) and somehow it doesn't seem to destroy those which are inserted with the procedure below.
Is there a way to force it to also take those into account?
namespace :db do
desc "load vdc members from google CSV"
task :load_csv_data => :environment do
require 'csv'
CSV.foreach("data.csv",{:headers=>:first_row}) do |row|
User.destroy_all(:email => row[7])
user = User.new(
:password => "temppwd",
:name => row[1],
:first_name => row[2],
:birth_date => row[3],
:street => row[4],
:zipcode => row[5],
:town => row[6],
:email => row[7],
:certificate_id => Certificate.find_by_name(row[9]).id,
:external_certificates => row[11],
:education_level => row[12],
:phone_number => row[15]
)
if user.save
puts "saved " + row[1] + " " + row[2]
else
puts "Could not save " + row[1] + " " + row[2] + " due to "
puts user.errors.full_messages.first if user.errors.any?
end
end
end
end
Related
I am trying to setup VirtualX Assessment Software that I downloaded online.
Here is the link where I got it: https://virtualx.sourceforge.net/download.html
I managed to make it run where I was able to load its webpage but there are still some functions where I'm getting an error.
Here, I'm trying to approve a test account that registered to the platform:
When I hit approve, here is the error that I'm getting:
Here is the content of routes.db
Virtualx::Application.routes.draw do
get "errors/not_found"
get "subcategory/index"
get "subcategory/list"
get "subcategory/show"
post "subcategory/save"
post "subcategory/update"
get "subcategory/edit"
get "subcategory/new"
get "subcategory/destroy"
post "subcategory/destroy"
#resources :article
get "article/index"
get "article/show"
get "article/list"
get "article/comment"
post "article/comment"
get "article/new"
post "article/save"
get "article/edit"
post "article/update"
get "article/news"
get "article/destroy"
post "article/destroy"
get "article/delete"
post "article/delete"
match '/getBlogcategory' => 'article#getBlogcategory'
match '/thumbsUp' => 'article#thumbsUp'
match '/thumbsDown' => 'article#thumbsDown'
match '/delete_comment' => 'article#delete_comment'
get "blog_category/index"
get "blog_category/list"
get "blog_category/show"
post "blog_category/save"
post "blog_category/update"
get "blog_category/edit"
get "blog_category/destroy"
post "blog_category/destroy"
get "blog_category/new"
match '/subcategory' => 'blog_category#subcategory'
match '/subcategory_article' => 'blog_category#subcategory_article'
match '/blog' => 'blog_category#blog'
match '/categoryArticle' => 'blog_category#categoryArticle'
resources :users do
get :autocomplete_user_name, :on => :collection
end
resources :folders
get "folders/index"
get "folders/new"
get "folders/create"
post "folders/create"
get "assets/destroy"
post "assets/destroy"
match "browse/:folder_id" => "folders#browse", :as => "browse"
match "browse/:folder_id/new_folder" => "folders#new", :as => "new_sub_folder"
match "browse/:folder_id/new_file" => "assets#new", :as => "new_sub_file"
match "browse/:folder_id/rename" => "folders#edit", :as => "rename_folder"
match '/getName' => 'folders#getName'
match '/unshareFolder' => 'folders#unshareFolder'
resources :assets
get "assets/index"
get "assets/new"
get "assets/create"
post "assets/create"
get "assets/destroy"
post "assets/destroy"
match "assets/get/:id" => "assets#get", :as => "download"
match "assets/share" => "assets#share"
match "assets/unshare" => "assets#unshare"
match '/lock' => 'assets#lock'
match '/unlock' => 'assets#unlock'
resources :aboutus
resources :clientinfo
resources :images
#get "images/index"
#get "images/new"
match '/view_aboutus' => 'home#view_aboutus'
match '/view_clients' => 'home#view_clients'
match '/view_features' => 'home#view_features'
match '/view_modules' => 'home#view_modules'
match '/view_contactus' => 'home#view_contactus'
match '/deleteUsersubject' => 'users#deleteUsersubject'
match '/clientImage' => 'images#clientImage'
match '/createClientimage' => 'images#createClientimage'
get "/questions/question_type_listing"
post "/questions/new"
resources :questions do
member do
get "delete_option"
post "delete_option"
get "delete_match_option"
post "delete_match_option"
get "delete_matrix_row"
post "delete_matrix_row"
get "delete_matrix_column"
post "delete_matrix_column"
get "delete_hrcl_option"
post "delete_hrcl_option"
get "saveImage"
post "saveImage"
end
end
#post "questions/publish_unpublish"
#get "questions/publish_unpublish"
match '/publish_unpublish' => 'questions#publish_unpublish'
match '/unpublish' => 'questions#unpublish'
match '/share' => 'questions#share'
match '/saveImage' => 'questions#saveImage'
match '/sharewithCategory' => 'questions#sharewithCategory'
match'/checkMark' => 'questions#checkMark'
match'/viewQuestion' => 'questions#viewQuestion'
get "subjects/add_subject_category"
resources :subjects
post "subjects/cs"
resources :categories
resources :category_titles
resources :emails
post "attend_exams/confirm_exam"
get "attend_exams/confirm_exam"
post "attend_exams/reject_exam"
get "attend_exams/reject_exam"
resources :attend_exams
get "attend_exams/index"
match '/examination' => 'attend_exams#examination'
match '/instruction' => 'attend_exams#instruction'
match '/evaluation' => 'attend_exams#evaluation'
match '/evaluation' => 'attend_exams#ramdomizeQuestions'
match '/examComplete' => 'attend_exams#examComplete'
match '/calculateScore' => 'attend_exams#calculateScore'
match '/windowClose' => 'attend_exams#windowClose'
match 'welcome/examinee_dashboard' => 'welcome#examinee_dashboard'
#get "exams/attend_exam"
#post "exams/attend_exam"
resources :exams
# member do
#get "exams/index"
# end
#end
match '/scheduleExam' => 'exams#scheduleExam'
match '/selectQuestion' => 'exams#selectQuestion'
match '/assignQustions' => 'exams#assignQustions'
match '/selectExaminee' => 'exams#selectExaminee'
match '/assignExaminees' => 'exams#assignExaminees'
match '/previewExam' => 'exams#previewExam'
match '/deleteExamQuestion' => 'exams#deleteExamQuestion'
match '/deleteExamUser' => 'exams#deleteExamUser'
match '/getMark' => 'exams#getMark'
match '/assignExam' => 'exams#assignExam'
match '/groupExam' => 'exams#groupExam'
match '/updateMark' => 'exams#updateMark'
match '/examtype' => 'exams#examtype'
match '/create_examtype' => 'exams#create_examtype'
match '/listExamtypes' => 'exams#listExamtypes'
match '/editExamtype' => 'exams#editExamtype'
match '/deleteExamtype' => 'exams#deleteExamtype'
match '/updateExamtype' => 'exams#updateExamtype'
match '/getExam' => 'exams#getExam'
match '/showEvaluationtype' => 'exams#showEvaluationtype'
match '/hideEvaluationtype' => 'exams#hideEvaluationtype'
match '/evaluate' => 'exams#evaluate'
match '/getExamQuestions' => 'exams#getExamQuestions'
match '/manualEvaluation' => 'exams#manualEvaluation'
match '/finishEvaluation' => 'exams#finishEvaluation'
match '/getCategoryexams' => 'exams#getCategoryexams'
match '/assignEvaluator' => 'exams#assignEvaluator'
match '/getEvaluator' => 'exams#getEvaluator'
match '/evaluator' => 'exams#evaluator'
match '/delete_evaluator' => 'exams#delete_evaluator'
match '/completedExams' => 'attend_exams#completedExams'
match '/pendingExams' => 'attend_exams#pendingExams'
match '/updateCategory' => 'category_titles#updateCategory'
match '/deleteCategory' => 'category_titles#deleteCategory'
get "settings/index"
post "settings/update"
get "feedback/index"
match '/assign' => 'feedback#assign'
match '/unassign' => 'feedback#unassign'
match '/viewFeedback' => 'feedback#viewFeedback'
match '/submitFeedback' => 'feedback#submitFeedback'
match '/viewfeedbackResponse' => 'feedback#viewfeedbackResponse'
match '/feedbackResponse' => 'feedback#feedbackResponse'
get "reports/index"
get "results/index"
match '/usersResult' => 'results#usersResult'
match '/resultIndex' => 'results#index'
match '/viewUserResult' => 'results#viewUserResult'
match '/groupResult' => 'results#groupResult'
match '/examsResult' => 'results#examsResult'
match '/viewExamResult' => 'results#viewExamResult'
match '/departmentResult' => 'results#departmentResult'
match '/viewDepartmentResult' => 'results#viewDepartmentResult'
#get "examination/index"
# get "reports/generateDepartmentReport"
match '/userReport' => 'reports#userReport'
match '/viewuserReport' => 'reports#viewuserReport'
match '/examReport' => 'reports#examReport'
match '/viewexamReport' => 'reports#viewexamReport'
match '/generateUser' => 'reports#generateUser'
match '/userSubjectwise' => 'reports#userSubjectwise'
match '/generateExamReport' => 'reports#generateExamReport'
match '/departmentReport' => 'reports#departmentReport'
match '/viewDepartmentReport' => 'reports#viewDepartmentReport'
match '/generateDepartmentReport' => 'reports#generateDepartmentReport'
match '/viewDepartmentReportgraph' => 'reports#viewDepartmentReportgraph'
match '/highLevel' => 'reports#highLevel'
match '/reportYear' => 'reports#reportYear'
match '/overall' => 'reports#overall'
match '/specificDepartment' => 'reports#specificDepartment'
match '/departmentDetailed' => 'reports#departmentDetailed'
match '/semesterDetailed' => 'reports#semesterDetailed'
match '/pass_fail' => 'reports#pass_fail'
match '/generatePassfail' => 'reports#generatePassfail'
match '/fetchExam' => 'reports#fetchExam'
match '/listCategories' => 'categories#listCategories'
match '/delete_category' => 'categories#delete_category'
get "questions/index"
get "subjects/index"
# resources :settings
resources :temporary_examinee
#get "temporary_examinee/new"
#get "temporary_examinee/create"
#post "temporary_examinee/create"
#get "user_registration/new"
resources :user_registration
#resources :welcome
get "welcome/index"
get "welcome/admin_dashboard"
get "welcome/examiner_dashboard"
get "welcome/qsetter_dashboard"
get "welcome/examinee_dashboard"
post "welcome/confirm_registration"
get "welcome/confirm_registration"
post "welcome/reject_registration"
get "welcome/reject_registration"
get "welcome/user_management"
get "welcome/workflow"
get "passwords/new"
#get "passwords/forgot"
match 'groupUser' => 'users#groupUser'
match 'createGroup' => 'users#createGroup'
get "user_sessions/new"
get "users/new"
get "users/generate_temporary_password"
post "users/generate_temporary_password"
match 'activate_inactivate' => 'users#activate_inactivate'
match 'activate' => 'users#activate'
match 'inactivate' => 'users#inactivate'
#match 'users/tempexaminee' => 'users#new'
resources :users
get "users/show"
get "users/edit"
get "home/index"
get "user_sessions/new"
resources :user_sessions
match 'login' => "user_sessions#new", :as => :login
match 'logout' => "user_sessions#destroy", :as => :logout
#get "password_resets/new"
resources :password_resets do
member do
get 'confirmEmail'
get 'setPassword'
get 'savePassword'
post 'savePassword'
get 'verifyPassword'
end
end
get "password_resets/edit"
# post "password_resets/edit"
get 'verify/:id' => 'user_verifications#index'
# The priority is based upon order of creation:
# first created -> highest priority.
# Sample of regular route:
# match 'products/:id' => 'catalog#view'
# Keep in mind you can assign values other than :controller and :action
# Sample of named route:
# match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
# This route can be invoked with purchase_url(:id => product.id)
# Sample resource route (maps HTTP verbs to controller actions automatically):
# resources :products
# Sample resource route with options:
# resources :products do
# member do
# get 'short'
# post 'toggle'
# end
#
# collection do
# get 'sold'
# end
# end
# Sample resource route with sub-resources:
# resources :products do
# resources :comments, :sales
# resource :seller
# end
# Sample resource route with more complex sub-resources
# resources :products do
# resources :comments
# resources :sales do
# get 'recent', :on => :collection
# end
# end
# Sample resource route within a namespace:
# namespace :admin do
# # Directs /admin/products/* to Admin::ProductsController
# # (app/controllers/admin/products_controller.rb)
# resources :products
# end
# You can have the root of your site routed with "root"
# just remember to delete public/index.html.
# root :to => "welcome#index"
root :to => 'home#index'
resources :home
# See how all your routes lay out with "rake routes"
# This is a legacy wild controller route that's not recommended for RESTful applications.
# Note: This route will make all actions in every controller accessible via GET requests.
# match ':controller(/:action(/:id(.:format)))'
end
Here is the content of welcome_controller:
=begin
welcome_controller.rb
Description: Controller file for managing the Welcome page of the application
Created on: October 11, 2010
Last modified on: March 18, 2013
Copyright 2013 PIT Solutions Pvt. Ltd. All Rights Reserved.
=end
class WelcomeController < ApplicationController
filter_access_to :all
#layout "home"
layout :choose_layout
def choose_layout
if action_name == 'workflow'
return 'workflow'
else
return 'application'
end
end
def index
end
def workflow
end
def admin_dashboard
#setting = Setting.find(:first)
#pageCollect = params[:pageLength].to_i
if #pageCollect == 0
#pagelength = 10
else
#pagelength = params[:pageLength].to_i
end
if params[:char]
letter = params[:char]
#letter = params[:char]
#registered_examinees = User.where(["is_registered = ? and role_id = ? and is_temp_examinee = ? and name like '#{params[:char]}%'", 1,Examinee,0]).paginate(:page => params[:page], :per_page => #pagelength)
#unapproved_examinees = User.where(["is_registered = ? and confirmed != ? and role_id = ? and is_temp_examinee = ? and name like '#{params[:char]}%'", 1,1,Examinee,0])
else
#registered_examinees = User.where(["is_registered = ?",1]).paginate(:page => params[:page], :per_page => #pagelength)
#unapproved_examinees = User.where(["is_registered = ? and confirmed != ? and role_id = ? and is_temp_examinee = ? and name like '#{params[:char]}%'", 1,1,Examinee,0])
end
end
def examiner_dashboard
end
def qsetter_dashboard
end
def examinee_dashboard
end
def confirm_registration
#all_approved_users = params[:check_examinee]
#all_approved_users.each do|approved|
#user = User.find_by_id(approved.to_i)
#user.update_attributes(:is_approved => 1)
if (#user.is_approved == 0 and #user.confirmed == false) or (#user.is_approved == 1 and #user.confirmed == false) or (#user.is_approved == 2 and #user.confirmed == false)
UserMailer.user_registration_email_confirmation(#user,$pwd).deliver
end
end
flash[:success] = t('flash_success.email_verification')
respond_to do |format|
format.html { redirect_to :back }
format.js
end
end
def reject_registration
#rejected_users = params[:check_examinee]
#rejected_users.each do|rejected|
#user = User.find_by_id(rejected.to_i)
unless (#user.is_approved == 2 and #user.confirmed == false)
#user.update_attributes(:confirmed => false,:is_approved => 2)
UserMailer.examinee_registration_rejection(#user).deliver
end
end
flash[:success] = t('flash_success.email_rejection')
respond_to do |format|
format.html { redirect_to :back }
format.js
end
end
end
Here is the content of admin_dashboard:
<div id="flash_notice" style="display: none;"></div>
<h2><%= t('welcome.filter_examinees')%></h2>
<div class="formContainer">
<table class="formTable" style="border:0px;">
<tr>
<td style="width:auto;" class="lettersort"><%= link_to t('general.all'), :action=>"admin_dashboard"%> | <% for char in 'A'..'Z' %>
<%= link_to( "#{char}", :char=>char, :action=>"admin_dashboard")%>
<%end%></td>
</tr>
</table>
</div>
<%if #setting.examineeApprove == 1%>
<div class="updateStatus">
<%unless #registered_examinees.empty?%>
<div class="qestionhead">
<h3><%= t('welcome.reg_examinees')%></h3>
<%= render :partial=>"users/pageLinks"%>
</div>
<%end%>
<%unless #letter == nil%>
<%= hidden_field_tag "char",#letter%>
<%else%>
<%= hidden_field_tag "char"%>
<%end%>
<div id="examinee_activation">
<%= render 'activation', :collection => #registered_examinees%>
</div>
<br>
</div>
<%else%>
<%= t('user.user_notfound')%>
<%end%>
<script type="text/javascript">
$(document).ready(function() {
$(".pageNum").click(function(){
var data = {pageLength: this.id, char: $("#char").val()};
var url = "<%= url_for(welcome_admin_dashboard_path)%>
";
$.get(url, data)
$(".pageNum").live("click", function(){
var url = "
<%= url_for(welcome_admin_dashboard_path)%>
";
var target = url + "?pageLength=" + this.id + "&char=" + $("#char").val()
$.getScript(target,$("#" + this.id).serialize(),function(data){
});
//$.getScript(this.href,+"?pageLength="+this.id);
return false;
});
});
$("#examinee_activation .pagination a").live("click", function(){
var link = this.href
var lastChar = link.substr(link.length - 1);
if (lastChar == '#'){
return false;
}
else{
$.getScript(this.href);
return false;
}
});
});
</script>
Sorry for including everything. I am very new to this and I'm just trying to run something that was created by others. Any help to fix why I'm getting this error is greatly appreciated.
I am trying to seed a database with initial users. The first two are testing accounts and populate fine:
User.create! :name => "Name", :surname => "Lastname", :admin => 't', :email => "admin#testing.co", :encrypted_password => "Password"
User.create! :name => "name", :surname => "lastname", :admin => 'f', :email => "test#faker.tld", :encrypted_password => "Password"
However, the error NameError: undefined local variable or method 'name' for main:Object is triggered when I try to run:
8.times do
User.create! :name => Faker::Name.first_name, :surname => Faker::Name.last_name, :admin => 'f', :email => Faker::Internet.email(name + "." + surname), :encrypted_password => Faker::Internet.password(10)
end
I can't figure out the problem. Any help? Thanks.
Ended up with this:
8.times do
name = Faker::Name.first_name
surname = Faker::Name.last_name
encrypted_password = Faker::Internet.password(10)
user_list << [name, surname, 'f', Faker::Internet.email(name + "." + surname), encrypted_password]
end
user_list.each do |name, surname, admin, email, encrypted_password|
User.create!(name:name, surname:surname, admin:admin, email:email, encrypted_password:encrypted_password)
end
I need to write a standalone ruby script that is supposed to deal with database. I used code given below in rails 3
#connection = ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "localhost",
:database => "siteconfig_development",
:username => "root",
:password => "root123"
)
results = #connection.execute("select * from users")
results.each do |row|
puts row[0]
end
but getting error:-
`<main>': undefined method `execute' for #<ActiveRecord::ConnectionAdapters::ConnectionPool:0x00000002867548> (NoMethodError)
what i am missing here?
SOLUTION
After getting solution from denis-bu i used it following way and that worked too.
#connection = ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "localhost",
:database => "siteconfig_development",
:username => "root",
:password => "root123"
)
sql = "SELECT * from users"
#result = #connection.connection.execute(sql);
#result.each(:as => :hash) do |row|
puts row["email"]
end
Maybe try this:
ActiveRecord::Base.establish_connection(...)
ActiveRecord::Base.connection.execute(...)
connection = ActiveRecord::Base.connection
connection.execute("SQL query")
I'd recommend using ActiveRecord::Base.connection.exec_query instead of ActiveRecord::Base.connection.execute which returns a ActiveRecord::Result (available in rails 3.1+) which is a bit easier to work with.
Then you can access it in various the result in various ways like .rows, .each, or .to_hash
From the docs:
result = ActiveRecord::Base.connection.exec_query('SELECT id, title, body FROM posts')
result # => #<ActiveRecord::Result:0xdeadbeef>
# Get the column names of the result:
result.columns
# => ["id", "title", "body"]
# Get the record values of the result:
result.rows
# => [[1, "title_1", "body_1"],
[2, "title_2", "body_2"],
...
]
# Get an array of hashes representing the result (column => value):
result.to_hash
# => [{"id" => 1, "title" => "title_1", "body" => "body_1"},
{"id" => 2, "title" => "title_2", "body" => "body_2"},
...
]
# ActiveRecord::Result also includes Enumerable.
result.each do |row|
puts row['title'] + " " + row['body']
end
note: copied my answer from here
You could also use find_by_sql
# A simple SQL query spanning multiple tables
Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id"
> [#<Post:0x36bff9c #attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]
How about this :
#client = TinyTds::Client.new(
:adapter => 'mysql2',
:host => 'host',
:database => 'siteconfig_development',
:username => 'username',
:password => 'password'
sql = "SELECT * FROM users"
result = #client.execute(sql)
results.each do |row|
puts row[0]
end
You need to have TinyTds gem installed, since you didn't specify it in your question I didn't use Active Record
class SupportMailer < ActionMailer::Base
default :from => "email1#gmail.com"
def welcome_email(ticket)
case ticket.game
when "gameone"
#ticket = ticket
headers["Reply-to"] = "email1+#{ticket.token}#gmail.com"
headers["Return-Path"] = "email1+#{ticket.token}#gmail.com"
mail(:from => "email1#gmail.com", :to => ticket.email, :subject => "Welcome to 1 Support Ticket")
when "gametwo"
#ticket = ticket
headers["Reply-to"] = "email2+#{ticket.token}#gmail.com"
headers["Return-Path"] = "email2+#{ticket.token}#gmail.com"
mail(:from => "email2#gmail.com", :to => ticket.email, :subject => "Welcome to 2 Support Ticket")
when "gamethree"
#ticket = ticket
headers["Reply-to"] = "email3+#{ticket.token}#gmail.com"
header["Return-Path"] = "email3+#{ticket.token}#gmail.com"
mail(:from => "email3#gmail.com", :to => ticket.email, :subject => "Welcome to 3 Support Ticket")
end
end
end
I've set my default :from, so I don't get why I keep getting this message, I'm also trying to set it via headers to no avail.
here are my settings
ActionMailer::Base.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:domain => "gmail.com",
:user_name => "emailx#gmail.com",
:password => "password",
:authentication => "plain",
:enable_starttls_auto => true
}
I just call it like so, SupportMailer.support_response(#message).deliver
How do I fix this?
I notice you have no default case for the case statement. If you never end up calling the "mail" method inside your methods in the Mailer class, you'll get that error. Try moving your case statement out to where you call SupportMailer, maybe have methods for each case. That way you never call the SupportMailer unless you've already determined the correct ticket game.
I am migrating an Rails 2.3.14 application to Rails 3.0. In it, a mailer sends a message with an attachment. Using the code below, this worked without issue in 2.3.x.
def notification(material, recipient, path_to_file)
enctype = "base64"
#recipients = recipient.email
#from = material.person.email
#reply_to = material.person.email
#subject = "New or updated materials: " + material.name
#sent_on = Time.now
#content_type = "multipart/mixed"
#headers['sender'] = material.person.email
part :content_type => "text/plain",
:body => render_message('notification',
:material => material,
:url => material.full_url_to_material)
attachment :content_type => "application" + "/" + material.file_type,
:body => File.read(path_to_file),
:filename => File.basename(material.file),
:transfer_encoding => enctype,
:charset => "utf-8" if !!material.send_as_attachment
end
Reading through the Rails 3.0 ActionMailer instructions, I have modified the method to the following:
def notification(material, recipient, path_to_file)
#material = material
#url = material.full_url_to_material
attachments[material.file_file_name] = File.open(path_to_file, 'rb'){|f| f.read} if material.send_as_attachment?
headers['sender'] = material.person.email
mail(:to => recipient.email,
:subject => "New or updated materials: " + material.name,
:reply_to => material.person.email,
:from => material.person.email)
end
MaterialMailer#notification is called when a material is created. I have the following spec to test this:
it "will include the materials as an attachement with the the send_as_attachment field is set to 1" do
it = Material.create(#materials_hash.merge(:send_notification => "1", :send_as_attachment => "1"))
email = ActionMailer::Base.deliveries[0]
email.body.should =~ Regexp.new("Name of the posted material: " + it.name )
email.has_attachments?.should be_true
end
As I mentioned, this worked fine in 2.3. Now, if I set the send_as_attachment flag to one, I get the following error, referencing the email.body.should line:
1) Material will include the materials as an attachement with the the send_as_attachment field is set to 1
Failure/Error: email.body.should =~ Regexp.new("Name of the posted material: " + it.name )
expected: /Name of the posted material: My material/
got: (using =~)
Diff:
## -1,2 +1 ##
-/Name of the posted material: My material/
If I change the spec and set the send_as_attachment to 0, I get the following error, referencing the has_attachments? line:
1) Material will include the materials as an attachement with the the send_as_attachment field is set to 1
Failure/Error: email.has_attachments?.should be_true
expected false to be true
So including the attachment is somehow breaking the email.
I have tried other methods for attaching the material:
attachments[material.file_file_name] = {:mime_type => "application" + "/" + material.file_content_type,
:content => File.read(material.file.path),
:charset => "utf-8"}
I have tried hardcoding the file paths to known files. But no luck.
Any where else I should look?
Per Christopher's suggestion, here is the mailer and spec code that I used to get it to work:
def notification(material, recipient, path_to_file)
#material = material
#url = material.full_url_to_material
attachments[material.file_file_name] = File.open(material.file.path, 'rb'){|f| f.read} if material.send_as_attachment?
headers['sender'] = material.person.email
mail(:to => recipient.email,
:subject => message_subject("New or updated materials: " + material.name),
:reply_to => material.person.email,
:from => material.person.email)
end
it "will include the materials as an attachment with the the send_as_attachment field is set to 1" do
it = Material.create(#materials_hash.merge(:send_notification => "1", :send_as_attachment => "1"))
Delayed::Worker.new(:quiet => true).work_off
email = ActionMailer::Base.deliveries[0]
email.parts.each.select{ |email| email.body =~ Regexp.new("Name of the posted material: " + it.name )}.should_not be_empty
email.has_attachments?.should be_true
end
In the spec, I had to check the body of each of the parts of the email, as it was not consistent on whether the attachment was the first or second part.