如何在Ruby on Rails上点击按钮更改值

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)

我一定会感激一些帮助!有任何想法吗?

编辑:为控制器中的参数添加了代码,我有.对不起,我应该把它包括在内.

Pau*_*ter 5

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)