post ruby 中的数据如何在 rails 上
how can post the data in ruby on rails
我是 rails ruby 的新人。我正在尝试为登录的用户添加任务,但是当我点击 task/new 路径时,如果我删除 url,它会以 url 的形式在 new.html.erb 文件中显示错误] 从表单中它可以工作但是在提交表单后数据没有保存在 db
No route matches {:action=>"show", :controller=>"task", :id=>nil}, missing required keys: [:id]
任务控制器
class TaskController < ApplicationController
def get; end
def index
@task = Task.all
end
def show
@task = Task.find(params[:id])
end
def new
@task = Task.new
end
def create
@task = Task.new(params.permit(:tasks).permit(:daily_task, :date, :current_user.id))
respond_to do |format|
if @task.save
format.html { redirect_to @task, notice: 'Task added' }
else
format.html { render :new }
end
end
end
架构
create_table "tasks", force: :cascade do |t|
t.string "daily_task"
t.datetime "date"
t.bigint "users_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["users_id"], name: "index_tasks_on_users_id"
end
new.html.erb
<h3>add task</h3>
<%= form_for :task, url: task_path do |f| %>
Add task: <%=f.text_field :daily_task %><br>
date: <%=f.datetime_select :date %>
<%= f.submit "Add" %>
<% end %>
运行 rails routes
将显示您应用程序中的可用路线:
$ rails routes | grep task
tasks GET /tasks(.:format) tasks#index
POST /tasks(.:format) tasks#create
new_task GET /tasks/new(.:format) tasks#new
edit_task GET /tasks/:id/edit(.:format) tasks#edit
task GET /tasks/:id(.:format) tasks#show
PATCH /tasks/:id(.:format) tasks#update
PUT /tasks/:id(.:format) tasks#update
DELETE /tasks/:id(.:format) tasks#destroy
您可以在第一列中的字符串后缀 _path
以创建可用的路由。例如,tasks_path
将重定向到 tasks#index
,new_task_path
将重定向到 tasks#new
。
请注意,某些路由需要 :id
,这是您要获取的记录的主键。对于 show
、edit
、update
和 destroy
,您想对 特定记录.[=37= 执行这些操作]
因此,如果您使用task_path
,则意味着您要获取特定记录;这是不正确的。相反,您需要指向 tasks#create
(POST 请求)。您可以通过多种方式进行:
# Considering `@task` is your object. You might be using `task` if you're using partials
<%= form_with model: @task do |f| %>
<%= form_with model: @task, url: tasks_path do |f| %>
<%= form_with model: @task, url: tasks_path, method: :post do |f| %>
<%= form with model: Task.new do |f| %>
编辑: 我刚刚注意到 ruby-on-rails-4
标签,form_with
对您不可用。
完全一样:
<%= form_for @task do |f| %>
<%= form_for @task, url: tasks_path do |f| %>
<%= form_for @task, url: tasks_path, method: :post do |f| %>
<%= form_for Task.new %>
EDIT2:关于 undefined method 'id' for :current_user:Symbol
您正在 Symbol
上调用方法 .id
。另外,您可能希望在私有方法中实现 Strong Parameters。
未经测试的代码,但我会这样做:
#/app/controllers/tasks_controller.rb
class TasksController < ApplicationController
def create
# set user_id in the backend, since POST requests can easily be modified
parameters = task_params.merge({ user_id: current_user.id })
@task = Task.new(parameters)
respond_to do |format|
if @task.save
format.html # ...
else
format.html # ...
end
end
private
def task_params
params.require(:task).permit(:daily_task, :date, :user_id) # `user_id` without s
end
end
我是 rails ruby 的新人。我正在尝试为登录的用户添加任务,但是当我点击 task/new 路径时,如果我删除 url,它会以 url 的形式在 new.html.erb 文件中显示错误] 从表单中它可以工作但是在提交表单后数据没有保存在 db
No route matches {:action=>"show", :controller=>"task", :id=>nil}, missing required keys: [:id]
任务控制器
class TaskController < ApplicationController
def get; end
def index
@task = Task.all
end
def show
@task = Task.find(params[:id])
end
def new
@task = Task.new
end
def create
@task = Task.new(params.permit(:tasks).permit(:daily_task, :date, :current_user.id))
respond_to do |format|
if @task.save
format.html { redirect_to @task, notice: 'Task added' }
else
format.html { render :new }
end
end
end
架构
create_table "tasks", force: :cascade do |t|
t.string "daily_task"
t.datetime "date"
t.bigint "users_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["users_id"], name: "index_tasks_on_users_id"
end
new.html.erb
<h3>add task</h3>
<%= form_for :task, url: task_path do |f| %>
Add task: <%=f.text_field :daily_task %><br>
date: <%=f.datetime_select :date %>
<%= f.submit "Add" %>
<% end %>
运行 rails routes
将显示您应用程序中的可用路线:
$ rails routes | grep task
tasks GET /tasks(.:format) tasks#index
POST /tasks(.:format) tasks#create
new_task GET /tasks/new(.:format) tasks#new
edit_task GET /tasks/:id/edit(.:format) tasks#edit
task GET /tasks/:id(.:format) tasks#show
PATCH /tasks/:id(.:format) tasks#update
PUT /tasks/:id(.:format) tasks#update
DELETE /tasks/:id(.:format) tasks#destroy
您可以在第一列中的字符串后缀 _path
以创建可用的路由。例如,tasks_path
将重定向到 tasks#index
,new_task_path
将重定向到 tasks#new
。
请注意,某些路由需要 :id
,这是您要获取的记录的主键。对于 show
、edit
、update
和 destroy
,您想对 特定记录.[=37= 执行这些操作]
因此,如果您使用task_path
,则意味着您要获取特定记录;这是不正确的。相反,您需要指向 tasks#create
(POST 请求)。您可以通过多种方式进行:
# Considering `@task` is your object. You might be using `task` if you're using partials
<%= form_with model: @task do |f| %>
<%= form_with model: @task, url: tasks_path do |f| %>
<%= form_with model: @task, url: tasks_path, method: :post do |f| %>
<%= form with model: Task.new do |f| %>
编辑: 我刚刚注意到 ruby-on-rails-4
标签,form_with
对您不可用。
完全一样:
<%= form_for @task do |f| %>
<%= form_for @task, url: tasks_path do |f| %>
<%= form_for @task, url: tasks_path, method: :post do |f| %>
<%= form_for Task.new %>
EDIT2:关于 undefined method 'id' for :current_user:Symbol
您正在 Symbol
上调用方法 .id
。另外,您可能希望在私有方法中实现 Strong Parameters。
未经测试的代码,但我会这样做:
#/app/controllers/tasks_controller.rb
class TasksController < ApplicationController
def create
# set user_id in the backend, since POST requests can easily be modified
parameters = task_params.merge({ user_id: current_user.id })
@task = Task.new(parameters)
respond_to do |format|
if @task.save
format.html # ...
else
format.html # ...
end
end
private
def task_params
params.require(:task).permit(:daily_task, :date, :user_id) # `user_id` without s
end
end