在我的网站上,我有卡,单击“美国”按钮时需要弹出的卡以及单击“欧洲”按钮时需要出现的卡。我编码了除最后一部分以外的所有内容。如果我在控制器的索引方法中输入此字符,则只会显示美国卡:
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
谢谢您的帮助。
答案 0 :(得分:2)
您可以使用单选按钮的值将usa
或europe
发送给控制器参数
然后,您可以使用send
方法在usa
模型上动态调用europe
或Food
。
例如,您从前端向控制器发送了一个参数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请求。