如何在 ruby​​ on rails 中发布数据

Posted

技术标签:

【中文标题】如何在 ruby​​ on rails 中发布数据【英文标题】:how can post the data in ruby on rails 【发布时间】:2021-11-03 13:43:30 【问题描述】:

我是 ruby​​ on rails 的新手。我正在尝试为登录的用户添加任务,但是当我点击任务/新路径时,如果我从表单中删除 url,它会在表单 url 中显示 new.html.erb 文件中的错误,但在提交表单后数据不保存在数据库中

 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 %>

【问题讨论】:

您应该使用form_with 而不是form_for。虽然它不能解决你的问题,但form_for 即将贬值。查看form_with 文档:apidock.com/rails/ActionView/Helpers/FormHelper/form_with 还是同样的错误 【参考方案1】:

运行 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#indexnew_task_pathtasks#new

请注意,某些路由需要 :id,这是您要获取的记录的主键。对于showeditupdatedestroy,您希望对特定记录执行这些操作。

因此,如果您使用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| %>

form_with


编辑:我刚刚注意到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 %>

form_for


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

【讨论】:

谢谢你仍然有一个错误,当我添加任务时它显示错误 undefined method `id' for :current_user:Symbol in task controller create method 确实,这是另一个错误。您在Symbol 上调用方法id,它告诉您此方法不存在。如果您使用的是身份验证 gem(如 Devise),您可能会使用 current_user(没有 : 查看我的更新!您将无法复制它,但想法就在那里(主要是:使用current_user.id 而不是:current_user.id)。如果有帮助,请点赞:) 非常感谢兄弟 享受 Ruby 和 Ror。检查edgeguides.rubyonrails.org,社区写了很棒的指南!

以上是关于如何在 ruby​​ on rails 中发布数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ruby​​ on rails 和 javascript 中使用 data-post 接收数据

如何在 ruby​​ on rails 中通过 websocket 发送保持活动的数据包

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

Ruby on Rails 中的会话如何工作?

如何从 Ruby on Rails 中的数据库查询中消除 N+1 查询?

如何通过 websockets 在 ruby​​ on rails 和 reactJS 之间发送数据