2012-01-09 52 views
1

简单情况 - 我有两个按钮,它们都调用相同的控制器/操作。控制器操作设置一个随机数,@random_number。rails 3 - 调用相同的控制器/动作,但有两个不同的视图更改

如果我点击按钮1,I所需的视图通过显示红色@random_number改变(通过JS)。如果我点击按钮2,我想通过在绿色中显示@random_number来改变视图(通过JS)。

什么是DRY最好的方式来做到这一点?我对轨道控制器/视图层的理解是,每个控制器/操作都与相应的视图相关联。但在这种情况下,我想为两个按钮点击使用相同的业务逻辑(生成一个随机数),但生成的视图取决于单击哪个按钮。

一种选择是按钮ID传递给控制器​​/动作,然后使用按钮ID控制器/动作的关联RJS文件来执行相应的JavaScript。但是我的直觉告诉我,这不是最好的方法。有没有更好的办法?

快速代码示例将不胜感激。

谢谢。

+0

如果您发现它们有助于获得更多答案,您应该接受问题的答案。 – 2012-01-09 09:25:20

回答

3

你应该有相同的视图和相同的控制器方法生成一个随机数。但是,在前端应该使用javascript或jquery来设置测试的颜色属性。要开始使用这种方法,您可以查看jQuerySuccess中的ajaxSuccess并单击事件绑定器。

另一种方法,如果你想避免使用JavaScript,将是你的链接字段(HTML5)来设置数据值。应将数据值作为生成的请求的一部分发送给控制器。这应该简单地设置,当你动态显示文本。这样你就不会在视图或控制器中重复代码的任何部分。

+0

是的,我希望能做一些类似于你在第一段中描述的东西。但是它提出了两个问题:1)对于设置@random_number的控制器/操作,响应应该是什么? 2)如何在ajaxSuccess回调中访问@random_number? – deruse 2012-01-09 09:38:31

+0

1)响应可能是两件事之一:它可以只是数字,也可以是在客户端进行操作的JavaScript。 2)您可以了解如何在这里得到Ajax中的响应:http://api.jquery.com/ajaxComplete/ – 2012-01-09 11:06:42

+0

家伙,我有一个类似的问题在这里,我解决不了基于这个答案。你可以看看吗? http://stackoverflow.com/questions/34817690/rails-ajax-js-erb-same-route-more-actions – 2016-01-16 07:24:17

2

如果只是以显示值,如果红色或绿色,那么为什么不能在前端处理它(如果不进行安全的东西,那么你可以避开服务器双面模板)。如果你想在服务器上处理它(为了保证安全),那么你可以为Button-1和Button-2调用两个不同的动作,并将产生一个随机数的代码移动到private function,你可以从动作。如果必须传递任何特定值以基于点击的特定按钮生成random number,则可以将值传递给private function并在那里处理。

对于一个代码示例我会这样处理。

def action_for_button_1 
    @random_number = generate_random_number(args) 
    # render template to show in green 
end 

def action_for_button_2 
    @random_number = generate_random_number(args) 
    #render template to show in red 
end 


private 

def generate_random_number(args) 
    # generate the random number and return it. 
end 
+0

是的,这将工作。假设我必须调用服务器,是否有办法通过一个操作来完成它?假设它是源自/index.html的AJAX请求,我可以在两个回调的形式下为index.html本身编写视图更新逻辑,每个按钮一个?这与编写action_for_button_1.rjs.erb和action_for_button_2_rjs.erb中的回调逻辑相反。这可能吗? – deruse 2012-01-09 09:35:03

相关问题