首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails:没有匹配的路由...缺少必需的密钥:[:id]

Rails:没有匹配的路由...缺少必需的密钥:[:id]
EN

Stack Overflow用户
提问于 2014-12-08 15:24:15
回答 3查看 15.9K关注 0票数 3

完全错误:

代码语言:javascript
复制
No route matches {:id=>#<Reminder id: nil, medication: nil, time: nil, created_at: nil, updated_at: nil, user_id: 1>} missing required keys: [:id]

以下是index.html.erb中导致错误的代码:

代码语言:javascript
复制
<tbody>
    <% @reminders.each do |reminder| %>
      <tr <%= dom_id(reminder) %>>
        <td><%= reminder.medication %></td>
        <td><%= reminder.time %></td>
        <td>
          <%= link_to "Edit", edit_reminder_path(reminder) %>
          or
          <%= link_to 'Remove', reminder, method: :delete, data: { confirm: 'Are you sure?' } %>
      </td>
      </tr>
    <% end %>
  </tbody>

型号:

代码语言:javascript
复制
class Reminder < ActiveRecord::Base
    validates :medication, presence: true
    belongs_to :user
end
class User < ActiveRecord::Base
  has_many :reminders
end

操作:

代码语言:javascript
复制
  def index
    @reminders = current_user.reminders
    @reminder = current_user.reminders.new 
  end
  def edit
  end

路由:

代码语言:javascript
复制
Medy::Application.routes.draw do
  devise_for :users
  resources :reminders
  root 'reminders#index'
end

我是否需要在编辑操作中添加一些内容才能使其正常工作?

在索引操作中将@reminders = Reminders.all更改为@reminders = current_user.reminders后,开始出现错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-10 05:45:00

这样做的原因是您正在向edit_reminder_path传递一个未保存的“提醒”实例。当您将实例作为参数传递给路由时,将在该实例上调用“to_param”方法。默认情况下,'to_param‘方法返回实例的'id’。

在您的情况下,您需要:

代码语言:javascript
复制
def index
  @reminders = current_user.reminders
  @reminder = current_user.reminders.new
end

因为您已经将@reminder的作用域限定为当前用户。该实例被添加到该用户的提醒集合中,因此也包含在@reminders中。这意味着当你在索引页面上呈现@提醒时,它也会尝试呈现还没有设置'id‘的未保存的@提醒。

更好的解决方案是将索引操作更改为:

代码语言:javascript
复制
def index
  @reminders = current_user.reminders
  @reminder = Reminder.new
end

然后,在保存提醒时,很可能是在“创建”操作中,您会将范围扩大到current_user:

代码语言:javascript
复制
def create
  @reminder = current_user.reminders.new(reminder_params)
  if @reminder.save .....
end
票数 11
EN

Stack Overflow用户

发布于 2014-12-10 03:38:46

错误出现在您的index操作中:

代码语言:javascript
复制
def index
  @reminders = current_user.reminders
  @reminder = current_user.reminders.new # <== HERE
end

您正在向current_user.reminders集合添加一个新的非持久化实例,这就是当您迭代该集合并尝试对其执行link_to操作时该错误所告诉您的:No route matches {:id=>#<Reminder id: nil

票数 2
EN

Stack Overflow用户

发布于 2015-03-29 23:51:44

https://github.com/rails/rails/issues/12178中报告了错误相关的em /错误

代码语言:javascript
复制
class ApplicationController < ActionController::Base
  protect_from_forgery
  before_action :set_locale

  def default_url_options(options={})
    { locale: I18n.locale }
  end

  private
    def set_locale
      I18n.locale = params[:locale] || I18n.default_locale
    end
end

你可以通过这种方式来解决bug

代码语言:javascript
复制
# app/controllers/application_controller.rb
def default_url_options(options = {})
  { locale: I18n.locale }.merge options
end

Ficaria assim /would看起来像这样

代码语言:javascript
复制
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
      protect_from_forgery
      before_action :set_locale

     def default_url_options(options = {})
      { locale: I18n.locale }.merge options
     end

      private
        def set_locale
          I18n.locale = params[:locale] || I18n.default_locale
        end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27353233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档