点击按钮后如何更改控制器中的方法?

时间:2019-05-05 14:28:45

标签: javascript html ruby-on-rails ruby

在我的网站上,我有卡,单击“美国”按钮时需要弹出的卡以及单击“欧洲”按钮时需要出现的卡。我编码了除最后一部分以外的所有内容。如果我在控制器的索引方法中输入此字符,则只会显示美国卡:

def index
  @foods = Food.usa
end

如果我输入以下内容:

def index
  @foods = Food.europe
end

仅欧洲卡弹出。我希望能够通过在我的站点上单击一个简单的按钮来做到这一点。我怎么做?

我的按钮代码

<div class="btn-group btn-group-toggle" data-toggle="buttons">
  <label class="btn btn-primary active">
    <input type="radio" name="options" id="europe" autocomplete="off" checked> Europe
  </label>
  <label class="btn btn-primary">
    <input type="radio" name="options" id="usa" autocomplete="off"> USA
  </label>
</div>

我的控制器的名称为foods_controller.rb

谢谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用单选按钮的值将usaeurope发送给控制器参数

然后,您可以使用send方法在usa模型上动态调用europeFood

例如,您从前端向控制器发送了一个参数food_name

您的代码将如下所示

def index
  @foods = Food.send(params[:food_type].to_sym)
end

但是直接使用来自用户的参数时要小心,因为它可能会破坏您的应用程序。

一种安全的方法是在您的控制器中创建一系列可能的食物类型。

类似这样的东西:

SUPPORTED_FOOD_TYPES = ["usa", "europe"].freeze

然后在控制器中像这样

def index
  @foods = Food.send(food_type.to_sym)
end


def food_type
  if SUPPORTED_FOOD_TYPES.include? params[:food_type]
    params[:food_type]
  else
    'all'
  end
end

您的html代码如下所示:

<%= form_tag(foods_path, method: "get") do %>
  <div class="btn-group btn-group-toggle" data-toggle="buttons">
    <label class="btn btn-primary active">
      <input type="radio" name="food_type" value="europe" id="europe" autocomplete="off" checked> Europe
    </label>
    <label class="btn btn-primary">
      <input type="radio" name="food_type" value="usa" id="usa" autocomplete="off"> USA
    </label>
  </div>
  <input type="submit" value="Apply">
<% end %>

答案 1 :(得分:0)

您可能希望将食物模型范围作为查询参数进行传递,以便在控制器中执行以下操作:

def index
  if params[:food_type].present?
    @foods = Food.send(params[:food_type].to_sym)
  else
    @foods = Food.all # fallback to something or all?
  end
end

没有看到其余的字体结束代码,有很多方法可以处理它。很有可能您将在不加载数据的情况下加载视图,然后在单击按钮时以food_type作为参数发送ajax请求。