没有路线匹配[GET]“ /模拟”

时间:2019-08-31 14:24:47

标签: ruby-on-rails ruby rest

对于这个论坛和一般的代码,我真的很陌生:)

我正在尝试在我的ruby on rails应用程序中创建一个小模拟器。 我创建了一个使用所有属性进行计算的模型,模拟的最终结果将存储在我的用户模型的属性中。 模拟器的目标:作为自由职业者的用户输入其所有企业信息,并在模拟结束时了解他必须支付多少税金。 我现在为Simulation类的“ set_result”方法中编码了一种可能的路径。

用于模拟的所有属性都通过视图中的简单form_for询问给用户,然后根据用户对表单的输入来计算模拟的结果。 我的模型如下:

class Simulation < ApplicationRecord
  belongs_to :user

  ACTIVITES = ["liberale", "commerciale ou industrielle", "artisanale"]
  YEAREXISTENCE = [1, 2, 3, 4]

  before_save :set_result

  validates :activity, presence: true, inclusion: { in: ACTIVITES }
  validates :year_existence, presence: true, inclusion: { in: YEAREXISTENCE }
  validates :reglementary, presence: true
  validates :accre, presence: true

  def set_result
    answer = params[:simulation]

    if answer[:activity] == "liberale" && answer[:year_existence] == 2 && answer[:accre]
      self.result = 0.12
    else
      self.result = 0.23
    end
  end
end

我的控制器:

class SimulationsController < ApplicationController
  before_action :set_simulation, only: [:show, :edit, :update, :destroy, :set_tax_rate]

  def new
    @simulation = Simulation.new
  end

  def create
    binding.pry
    @simulation = Simulation.new(simulation_params)
    if @simulation.save
      render :show
    else
      render :new
    end
  end

  private

  def set_simulation
    @simulation = Simulation.find(params[:id])
  end

  def simulation_params
    params.require(:simulation).permit(:activity, :user_id)
  end
end

在我的视图中放置了simple_form_for并询问了模拟结果所需的所有属性。

<div class="container">
<h1 class= "structure ml-5">simulation</h1>
</div>

<!-- <h1>votre tx : <%= @result %></h1> -->

<div class="row">
  <div class="col-5">
    <%= simple_form_for @simulation, root_path, method: :get do |f| %>

        <%= f.input :activity,
        label:"Quelle est votre catégorie d'activité ?",
        collection: Simulation::ACTIVITES,
        include_blank: true,
        as: :select %>

        <%= f.input :reglementary,
        label:"Est-ce une activité libérale règlementée ?",
        as: :boolean,
        include_blank: true,
        as: :select %>

        <%= f.input :year_existence,
        label:"Quel est l'âge de l'entreprise en année d'activité ?",
        collection: Simulation::YEAREXISTENCE,
        include_blank: true,
        as: :select %>

        <%= f.input :accre,
        label:"Avez-vous obtenu l'ACCRE lors de votre création d'entreprise ?",
        as: :boolean,
        include_blank: true,
        as: :select %>

      <%= f.submit "valider", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
``````````````

I tried to "binding.pry" to see if the form gets me to the create action from the controller but it seems that it does not. 
When I get to the route : "/simulations/new", i can enter infos, but when i submit I have the error : "No route matches [GET] "/simulations"". As is I was redirecting my user to the "index" of simulations, which I don't think I did in my code...

when I try to create a new simulation in my console by for example

simul = Simulation.new(activity: "liberale"...)
simul.user_id = User.last

and then, trying to create it in my db :

simul.save


I get this error :

"NameError: undefined local variable or method `params' for #<Simulation:0x00007fcb6ea6f5b8>
from /Users/mac/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activemodel-5.2.3/lib/active_model/attribute_methods.rb:430:in `method_missing"

of course, I removed all the raise and binding.pry before trying it :)
anyone has an idea of what gets in the way of my simulation params ???
I am not sure of the "set_result" method and especially how I called the params for simulation... maybe that's the problem. I tried to see in my previous apps, and seems that I did the same though...

5 个答案:

答案 0 :(得分:3)

在您的simple_form调用中删除“ url”和“ method”选项。用途如下

<%= simple_form_for @simulation do |f| %>

默认情况下,simple_forms将使用“ POST” http方法提交表单。 在错误中,我可以看到由于“ GET” httpmethod,它达到了模拟/索引端点。

/ simulations的

'POST'将在控制器中执行create操作。 希望它能起作用。

答案 1 :(得分:0)

您错过了index中的routes.rb路线。它映射到/simuations路径。

需要将其添加到您的列表中:

resources :simulations, only: [:index, :new, :create, :show, :edit, :update, :destroy]

或使用隐式“所有REST路由”:

resources :simulations

答案 2 :(得分:0)

只需将其更改为

resources :simulations

或将:index添加到您的列表:

resources :simulations, only: [:index, :new, :create, :show, :edit, :update, :destroy]

您还可以将其他情况排除在外(它将执行所有其他操作):

resources :simulations, except: [:destroy]

有关路由的更多信息,请点击此处:https://guides.rubyonrails.org/routing.html

答案 3 :(得分:0)

@mrzasa 谢谢。我添加了所有资源只是为了进行测试。在索引中,我想拥有仿真的属性,所以:

index.html.erb

<p><%= @simulations.first.activity %></p>
<p><%= @simulations.first.accre %></p>
<p><%= @simulations.first.reglementary %></p>
<p><%= @simulations.first.year_existence %></p>
<h1><%= @simulations.first.result %></h1>

我最终得到的是“ nil:NilClass的未定义方法'activity'”。我的模拟未创建... 但是在控制器的create方法中,我还为刚在新环境中创建的模拟显示添加了重定向。

def create
    @simulation = Simulation.new(simulation_params)
    @simulation.user = current_user
    if @simulation.save
      redirect_to simulation_path(@simulation)
    else
      render :new
    end
  end

答案 4 :(得分:0)

这些是我尝试在代码中进行的更改/更正:

这是我的表格:

Snackbar.make(findViewById(android.R.id.content), 
        "Pressed Settings", Snackbar.LENGTH_LONG).show()

enter image description here

这是我提交时得到的结果(与simple_form中的方法<%= simple_form_for @simulation, url: simulations_path, method: :get do |f| %> <%= f.input :activity, label:"Quelle est votre catégorie d'activité ?", collection: Simulation::ACTIVITES, value_method: :activity, as: :select %> <%= f.input :reglementary, label:"Est-ce une activité libérale règlementée ?", as: :boolean, value_method: :reglementary, as: :select %> <%= f.input :year_existence, label:"Quel est l'âge de l'entreprise en année d'activité ?", collection: Simulation::YEAREXISTENCE, include_blank: true, value_method: :year_existence, as: :select %> <%= f.input :accre, label:"Avez-vous obtenu l'ACCRE lors de votre création d'entreprise ?", as: :boolean, include_blank: true, value_method: :accre, as: :select %> <%= f.submit "valider", class: "btn btn-primary" %> :post相同)

enter image description here

:get在这里,但实例未创建...

在Simulation模型中,我的“ before_save”方法有问题吗?

  

simulation.rb

params[:simulation][:activity]...

或者在控制器的“创建方法”中...:

class Simulation < ApplicationRecord
  belongs_to :user

  ACTIVITES = ["liberale", "commerciale ou industrielle", "artisanale"]
  YEAREXISTENCE = [1, 2, 3, 4]

  before_save :set_result

  validates :activity, presence: true, inclusion: { in: ACTIVITES }
  validates :year_existence, presence: true, inclusion: { in: YEAREXISTENCE }
  validates :reglementary, presence: true
  validates :accre, presence: true

  def set_result
    raise
    if params[:simulation][:activity] == "liberale" && params[:simulation][:year_existence] == 2 && params[:simulation][:accre]
      self.result = 0.12
    else
      self.result = 0.23
    end
  end
end

我现在迷路了?