-1

안녕하세요, 저는 컨트롤러가 2 개 있습니다. 발전기 및 결과. 결과를 얻으려면 Generator의 값이 필요합니다 (어떻게 든 값은 모델에 저장되었습니다).모델 + 컨트롤러 상속

내가 생성기의 값을 가질 수 있도록 결과에서 생성자의 데이터를 가져와야하고 결과에 필요한 것이 무엇인지 알 수 있습니까? 내 generatorController

#generator_controller.rb 
class GeneratorsController < ApplicationController 
    before_action :set_generator, only: [:show, :edit, :update, :destroy] 
    after_action :generate_option, only: [:create, :update] 
    # GET /generators 
    # GET /generators.json 
    def index 
    @generators = Generator.all 
    end 

    # GET /generators/1 
    # GET /generators/1.json 
    def show 
    end 

    # GET /generators/new 
    def new 
    @generator = Generator.new 
    end 

    # GET /generators/1/edit 
    def edit 
    end 

    # POST /generators 
    # POST /generators.json 
    def create  
    @generator = Generator.new(generator_params) 
    respond_to do |format| 
     if @generator.save 
     format.html { redirect_to @generator, notice: 'Generator was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @generator } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @generator.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /generators/1 
    # PATCH/PUT /generators/1.json 
    def update 
    respond_to do |format| 
     if @generator.update(generator_params) 
     format.html { redirect_to @generator, notice: 'Generator was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @generator.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /generators/1 
    # DELETE /generators/1.json 
    def destroy 
    @generator.destroy 
    respond_to do |format| 
     format.html { redirect_to generators_url } 
     format.json { head :no_content } 
    end 
    end 

    def generate_option 
    @generator.choice = params[:choice] 
    if params[:choice] == 'Randomly' 
     random_generate 
    elsif params[:choice] == 'No_of_ATGC' 
     no_ATGC 
    elsif params[:choice] == 'Seating' 
     seating 
    end 
    @generator.save! 
    end 

    private 
    def set_generator 
     @generator = Generator.find(params[:id]) 
    end 

    def generator_params 
     params.require(:generator).permit(:primer_length, :choice, :random_primer_generated) 
    end 
end 

에서

#result_controller.rb 
class ResultsController < ApplicationController 
    before_action :set_result, only: [:show, :edit, :update, :destroy] 
    after_action :generate_result, only: [:create] 
    # GET /results 
    # GET /results.json 
    def index 
    @results = Result.all 
    end 

    # GET /results/1 
    # GET /results/1.json 
    def show 
    end 

    # GET /results/new 
    def new 
    @result = Result.new 
    end 

    # GET /results/1/edit 
    def edit 
    end 

    # POST /results 
    # POST /results.json 
    def create 
    @result = Result.new(result_params) 
    respond_to do |format| 
     if @result.save 
     format.html { redirect_to @result, notice: 'Result was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @result } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @result.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /results/1 
    # PATCH/PUT /results/1.json 
    def update 
    respond_to do |format| 
     if @result.update(result_params) 
     format.html { redirect_to @result, notice: 'Result was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @result.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /results/1 
    # DELETE /results/1.json 
    def destroy 
    @result.destroy 
    respond_to do |format| 
     format.html { redirect_to results_url } 
     format.json { head :no_content } 
    end 
    end 

    def set_ncbi_ref_seq 
    @result.ncbi_ref_seq = params[:ncbi_ref_seq] 
    generate_result 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_result 
     @result = Result.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def result_params 
     params.require(:result).permit(:ncbi_ref_seq) 
    end 
end 

와 ApplicationController

#application_controller.rb 
class ApplicationController < ActionController::Base 

    protect_from_forgery with: :exception 

    def random_generate 
    length = @generator.primer_length 
    length=length.to_i 
     chars = 'ATGC' 
     seq = '' 
     length.times { seq << chars[rand(chars.size)] } 
     @generator.random_primer_generated = seq 

     @generator.c_primer =Bio::Sequence::NA.new(@generator.random_primer_generated.reverse) 
     @[email protected]_primer.complement.upcase 
    end 

    def no_ATGC 
    counts = {'A'=>params[:no_A],'T'=>params[:no_T],'G'=>params[:no_G],'C'=>params[:no_C]} 
    # total=params[:no_A]+params[:no_T]+params[:no_G]+params[:no_C] 
    @generator.random_primer_generated = Bio::Sequence::NA.randomize(counts).upcase 
    @generator.primer_length = @generator.random_primer_generated.length 

    @generator.c_primer =Bio::Sequence::NA.new(@generator.random_primer_generated.reverse) 
    @[email protected]_primer.complement.upcase 
    end 

    def seating()  
    desired_random_primer=params[:user_seq] 
    @generator.primer_length = desired_random_primer.length 
    user_seq_xspace= params[:user_seq].delete('*') 
    [email protected]_length-user_seq_xspace.length() 
    length = empty_slots 
     chars = 'ATGC' 
     seq = '' 
     length.times { seq << chars[rand(chars.size)] } 
    temp_random_primer_generated = seq 

    no=0 
    n=0 
    while n < @generator.primer_length do 
    if desired_random_primer[n] == "*" 
     desired_random_primer[n]=desired_random_primer[n].replace(temp_random_primer_generated[no]) 
     no+=1 
    else 
     desired_random_primer[n]=desired_random_primer[n] 
    end 
    n+=1 
    end 
    @generator.random_primer_generated = desired_random_primer 

    @generator.c_primer =Bio::Sequence::NA.new(@generator.random_primer_generated.reverse) 
    @[email protected]_primer.complement.upcase 
    end 

    *def generate_result 
    ref_seq = @result.ncbi_ref_seq 
    Bio::NCBI.default_email = "[email protected]" 
    fasta_sequence = Bio::NCBI::REST::EFetch.nucleotide(ref_seq,"fasta") 
    fasta=Bio::FastaFormat.new(fasta_sequence) 
    @result.genome_seq = fasta.data 
    @result.genome_sample = fasta.definition 

    [email protected]_seq.scan(@generator.c_primer) 
    @result.binding_times = p.length() 

    @result.save 
    end* 

end 
+0

상속은 예를

를 들어, 모델에 약간의 정보를 넣어 것

? Generator와 Result는 모델입니까? 귀하의 질문을 명확히하기 위해 몇 가지 코드를 첨부하십시오, 그렇지 않으면 아무도 귀하의 질문에서 작은 비트를 이해할 수 없을 것입니다! – rewritten

+0

예 그들은 두 가지 모델입니다. [email protected]_seq.scan (@ generator.c_primer) @ result.binding_times = p.length() – BC2

+0

두 모델 또는 두 개의 컨트롤러가 있습니다. 상속은 어디 있습니까? 질문을 편집하고 코드를 추가하십시오 (함수 호출이 아님). 라우팅 설정은 어떻게되어 있습니까? – rewritten

답변

1

은 컨트롤러에 문제가 있습니다. 와 ApplicationController에

  1. 방법 (공유로드하거나 유틸리티 방법 같은 것들을위한 전형적인 후보 : current_user (memoized) 모든 컨트롤러에 사용할 수 이는 AppController가 다루지 않는 특정 컨트롤러에 속하는 방법.. 당신이 ResultsController에서 생성기 인스턴스를 원하는 경우

  2. , 당신은 그것을 검색하는 방법이 필요합니다. 결과 인스턴스에 PARAMS에서 또는 외부 키에서.

  3. 이 모델을 수정하는 after_action를 사용하지 마십시오, 모든 일이 일어날 수있다. e 모델이 저장되지 않았을 수 있으며 앱 흐름이 매우 모호합니다.

차라리
class Generator < ActiveRecord::Base 

    # other stuff you already have 

    def set_primer_from_counts(num_a, num_t, num_g, num_c) 
    counts = {'A'=>num_a,'T'=>num_t,'G'=>num_g,'C'=>num_c} 
    random_primer_generated = Bio::Sequence::NA.randomize(counts).upcase 
    primer_length = random_primer_generated.length 
    c_primer = Bio::Sequence::NA.new(random_primer_generated.reverse) 
    @generator.c_primer = c_primer.complement.upcase 
    end 

end 


class GeneratorController < ApplicationController 

    def create 
    @generator = Generator.new(generator_params) 
    @generator.set_primer_from_counts(params[:no_A], params[:no_T], params[:no_G], params[:no_C]) 
    # .... 
    end 
end 
+0

1 번으로는 분명합니다. 그러나 2 번에 대해서는 외래 키를 사용하여 Generator 인스턴스를 검색하는 방법에 대한 가이드 라인을 알려주십시오. (나는 그것을 통해 Generator.id 이해)하지만 어디 코드를 넣어야합니까 – BC2

+0

올바른 질문입니다 : "어떻게 사용자 (또는 시스템) 발전기를 선택하려면 기대합니까?".아마도 폼의 사용자 선택 일 수도 있습니다. 어쩌면 생성 된 결과 레코드의 일부 속성에 따라 달라질 수 있습니다. 어쨌든 결정하고 구현해야합니다. – rewritten