2015-02-06 68 views
0

应该通过不同的控制器#操作持久化实例变量,而不使用会话?如何通过不同的轨道控制器持久参数控制器在轨道中的操作

这是问题的一个例子:

有一个住院HAS_ONE处方

从住院#显示我有一个的link_to处方#新的额外的参数,波纹管看到:

<%= link_to t('hospitalizations.prescription'), new_prescription_path(hospitalization_id: @hospitalization.id,...) 

而诀窍是:在处方#new I ca ñ检索

@hospitalization = Hospitalization.find_by(id: params[:hospitalization_id]) 

但是,当我按下提交,并涉及到处方#创建,@hospitalization解答时试图做类似

@prescription = @hospitalization.build_prescription(prescription_params) 

怎么会是最好的方式实例化这些参数,以便它们在需要的控制器#操作之间持续存在或轻松执行?我应该如何实例化所属模型处方?我应该直接在那里,在处方#新的?像:

@prescription = Prescription.new(hospitalization_id: params[:hospitalization_id]) 
+0

所以我理解你 - 你想,每一个新住院创建一个新的处方(空单?)? – Anthony 2015-02-06 12:58:54

+0

是的,每一次住院治疗都应该有自己的处方,但并不是要一起注册。他们是分开的阶段 – dillenburg 2015-02-06 13:09:27

回答

0

使用neseted resources这样:

resources hospitalizations do 
    resource :prescription 
end 

这样,你的路径将会是这样的:

/hospitalizations/:hospitalization_id/prescription 

,您可以使用以下方法来生成它:

new_hospitalization_prescription_path(@hospitalization) 

现在在您的控制器中,您可以访问参数params[:hospitalization_id]。例如,在create方法您PrescriptionController的:

def create 
    hospitalization = Hospitalization.find(params[:hospitalization]) 
    prescription = Prescription.new(hospitalization: hospitalization, ...) 
    # ... 
end 
+0

尝试了你的解决方案,我发现我必须在我的'form_for @ prescription'上添加':url => new_hospitalization_prescription_path' 这应该是不是全部?因为现在我得到一个**没有路线匹配[邮政]“/医院/ 6 /处方/新”**这是奇怪的,因为路线是在我的耙路线输出。 – dillenburg 2015-02-06 13:29:56

+0

你重新启动了你的服务器吗? – 2015-02-06 13:30:25

+0

是的,我做了,只是意识到form_for是处方#新,而它应该是处方#创建,这里愚蠢的错误。虽然我仍然无法创建,但它给我带来了同样的错误“未定义的方法... for nil:nilClass”指的是@hospitalization。我应该改变什么吗? – dillenburg 2015-02-06 13:36:24