对于这个论坛和一般的代码,我真的很陌生:)
我正在尝试在我的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...
答案 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()
这是我提交时得到的结果(与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
相同)
: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
我现在迷路了?