【问题标题】:rails 3 - calling same controller/action but having two different view changesrails 3 - 调用相同的控制器/动作,但有两个不同的视图更改
【发布时间】:2012-01-09 08:49:16
【问题描述】:

简单的场景——我有两个按钮,它们都调用相同的控制器/动作。控制器操作设置一个随机数,@random_number。

如果我单击按钮 1,我希望通过以 RED 显示 @random_number 来更改视图(通过 JS)。如果我单击按钮 2,我希望通过以绿色显示 @random_number 来更改视图(通过 JS)。

执行此操作的最干燥方法是什么?我对 Rails 的控制器/视图层的理解是,每个控制器/动作都与相应的视图相关联。但在这种情况下,我想对两个按钮单击使用相同的业务逻辑(生成一个随机数),但结果视图取决于单击哪个按钮。

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

非常感谢快速的代码示例。

谢谢。

【问题讨论】:

  • 如果您发现问题的答案有助于获得更多答案,您应该接受这些答案。

标签: ruby-on-rails model-view-controller


【解决方案1】:

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

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

【讨论】:

  • 是的,我希望做一些类似于你在第一段中描述的事情。但它提出了两个问题:1)对于设置@random_number 的控制器/动作应该有什么响应? 2) 如何在 ajaxSuccess 回调中访问@random_number?
  • 1) 响应可能是以下两种情况之一:可能只是数字,也可能是在客户端进行操作的 javascript。 2)您可以在此处阅读有关如何在 ajax 中获取响应的信息:api.jquery.com/ajaxComplete
  • 伙计们,我在这里有一个类似的问题,我无法根据这个答案解决。你能看一下吗? stackoverflow.com/questions/34817690/…
【解决方案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

【讨论】:

  • 是的,这行得通。假设我必须调用服务器,有没有办法通过一个动作来做到这一点?假设它是来自 /index.html 的 AJAX 请求,我可以在 index.html 本身中以两个回调的形式编写视图更新逻辑,每个按钮一个?这与在 action_for_button_1.rjs.erb 和 action_for_button_2_rjs.erb 中编写回调逻辑相反。这可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
相关资源
最近更新 更多