Che*_*ist 3 ruby ruby-on-rails button
我遇到很多问题,我不太明白视图如何将信息发送给控制器,因此可以对其进行操作.
我有一个按钮,点击它时应该改变它的值.值在Yes/No.之间变化.单击该按钮时,需要更改数据库中的相应值,然后在视图中我已经具有决定按钮值的逻辑.
这是一些代码,我想象它是如何工作的...
show.html.erb查看
<% status = @problem.status? 'No' : 'Yes' %>
<%= link_to status, @problem, :class => 'btn btn-success' %>
Run Code Online (Sandbox Code Playgroud)
在我的ProblemsController中
def show
@problem = Problem.find(params[:id])
@problem.status ? @problem.status : (@problem.status == 'false')
end
def solve
end
Run Code Online (Sandbox Code Playgroud)
我不确定是否应该在show方法中更改数据库值或创建另一个.问题是我不知道如何从视图到控制器进行通信.我怎样才能做到这一点?
我正在考虑加入:data { solve: @problem.status }到link_to标签,不知道这将有助于虽然.到目前为止,我无法进入解决方法(我尝试添加:action => 'solve'或:action => '/problems/solve'),这没有帮助.以下是我刚尝试过的,但它不起作用(不会在ProblemsController中解决操作).
<%= link_to status, @problem, :controller => 'problems', :action => 'solve', :class => 'btn' %>
Run Code Online (Sandbox Code Playgroud)
我一定会感激一些帮助!有任何想法吗?
编辑:为控制器中的参数添加了代码,我有.对不起,我应该把它包括在内.
http"GET"请求通过查询参数(看起来像URL的部分)将其数据发送到控制器?someAttribute=foo&someOtherAttribute=bar.
的link_to助手可以接受像我如上所述将被包括在生成的URL作为查询参数的其他参数.URL路径助手(problem_path例如)可以执行相同的操作.例如:problem_path(@problem, :additionalParam=>"someValue"),它会产生类似的东西problem/1?additionalParam=someValue.
您使用上一个link_to示例进入了正确的轨道,您只需要以与上述类似的方式添加其他参数.但是,当您可以使用url帮助程序时,该方法不必要地冗长.
如果您的要求是简单地翻转布尔status字段,则该show操作将不是合适的位置.我不知道是否该solve行动旨在处理这个假摔,但为了清楚起见,我们会处理在动作这项活动叫flop,从中你可以简单redirect_to的show动作.
在你的routes.rb,设置flop动作.
resources :problems do
member do
get :flop
end
end
Run Code Online (Sandbox Code Playgroud)
如果你这样做rake routes,你会发现你将有另一个URL帮助器,如下所示:
flop_problem GET /problems/:id/flop(.:format) problem#flop
Run Code Online (Sandbox Code Playgroud)
所以你可以这样写你的按钮link_to:
link_to (@problem.status ? "Yes" : "No"), flop_problem_path(@problem)
Run Code Online (Sandbox Code Playgroud)
这导致了以下flop行动ProblemController:
def flop
problem = Problem.find(params[:id])
problem.status = !problem.status # flop the status
problem.save
redirect_to problem_path(problem)
end
Run Code Online (Sandbox Code Playgroud)
show除了加载问题对象之外,该操作不需要任何其他操作.
顺便说一下,如果你想link_to稍微清理一下代码,可以在Problem模型类中添加一个方法:
class Problem < ActiveRecord::Base
# other code ...
def status_name
status ? "Yes" : "No"
end
end
Run Code Online (Sandbox Code Playgroud)
哪个可以这样使用:
link_to @problem.status_name, flop_problem_path(@problem)
Run Code Online (Sandbox Code Playgroud)