2017-07-22 3 views
2

La migration de base de données a champ experience défini comme une gammeComment utiliser Range comme l'un des paramètres de données POST sur les rails contrôleur

class CreateJobPosts < ActiveRecord::Migration[5.1] 
    def change 
    create_table :job_posts do |t| 
     t.string :name, null: false, limit: 100 
     t.string :location, null: false, limit: 100 
     t.int4range :experience, null: false 
     t.text :description, null: false 
     t.text :skills, null:false 
     t.boolean :active, null: false, default: false 
     t.string :seo_meta_keywords, array: true, null: false 
     t.string :seo_meta_description, null: false, limit: 150 

     t.timestamps 
    end 
    add_index :job_posts, :name, unique: true 
    add_index :job_posts, :location 
    add_index :job_posts, :active 
    end 
end 

maintenant lors de l'écriture des tests, je factorygirl défini certains modèles comme si

FactoryGirl.define do 
    factory :job_post do 
     name "DevOps Coach" 
     location "Bangalore" 
     experience (4..10) 
     description 'Test Description' 
     skills 'Test Skills' 
     active true 
     seo_meta_keywords ['keywords','keywords'] 
     seo_meta_description 'dummy descriptions' 
    end 
end 

Et dans le contrôleur

def job_post_params 
    params.require(:job_post).permit(:name, :location, :experience, :description, :skills, :active, :seo_meta_description, seo_meta_keywords: []) 
end 

les hachages d'attributs sont initialisées comme prévu

[89, 98] in /Users/anadi/Code/bauji/spec/controllers/job_posts_controller_spec.rb 
    89: 
    90:  context "with invalid params" do 
    91:  it "returns a success response (i.e. to display the 'new' template)" do 
    92:   byebug 
    93:   temp = invalid_attributes 
=> 94:   post :create, params: {job_post: invalid_attributes}, session: valid_session 
    95:   expect(response).to be_success 
    96:  end 
    97:  end 
    98: end 
(byebug) temp 
{:name=>"No Name", :location=>"Nay", :experience=>4..10, :description=>"Test Description", :skills=>"Test skills", :active=>true, :seo_meta_keywords=>["keywords", "keywords"], :seo_meta_description=>"dummy descriptions"} 

mais les tests de la méthode PUT POST & échouent parce que :experience attribut est nul pour le contrôleur

[24, 33] in /Users/anadi/Code/bauji/app/controllers/job_posts_controller.rb 
    24: # POST /job_posts 
    25: # POST /job_posts.json 
    26: def create 
    27:  byebug 
    28:  @job_post = JobPost.new(job_post_params) 
=> 29:  respond_to do |format| 
    30:  if @job_post.save 
    31:   format.html { redirect_to @job_post, notice: 'Job post was successfully created.' } 
    32:   format.json { render :show, status: :created, location: @job_post } 
    33:  else 
(byebug) @job_post 
#<JobPost:0x007fda5fb21920> 
(byebug) @job_post.experience 
*** ArgumentError Exception: bad value for range 

nil 

Solution:

# Never trust parameters from the scary internet, only allow the white list through. 
def job_post_params 
    raw_post_params = params.require(:job_post).permit(:name, :location, :experience, :description, :skills, :active, :seo_meta_description, seo_meta_keywords: []) 
    range_begin, range_end = raw_post_params[:experience].split('..').map { |v| Integer(v) } 
    raw_post_params[:experience] = Range.new(range_begin, range_end) 
    raw_post_params 
end 

Pourrait-il être plus compact?

+0

seulement: l'expérience PARAM est nulle? –

+0

oui, il faut d'autres paramètres sans problème –

Répondre

1

Lorsque vous effectuez la demande POST, le 4..10 est probablement converti en String: "4..10". Essayez et analyser la chaîne dans votre contrôleur avec quelque chose de similaire à:

range_begin, range_end = params[:experience].split('..').map { |v| Integer(v) } 
experience = Range.new(range_begin, range_end) 

Ensuite, vous pouvez définir cette experience à attribuer sur votre JobPost

+0

Salut! oui, cela a aidé à le réparer, ajouté le code en question, se demandant s'il peut y avoir moins de lignes de code? –