【问题标题】:RoR - UrlGenerationError, no routes matches, missing required key [:id]RoR - UrlGenerationError,没有路由匹配,缺少必需的键 [:id]
【发布时间】:2015-04-21 19:40:27
【问题描述】:

我正在尝试创建一个帖子页面。用户可以在其中查看所有公开帖子。我可以成功创建帖子,但我看不到它们。

Ribbits#index 显示中的 ActionController::UrlGenerationError C:/Sites/myBlog/app/views/ribbits/index.html.erb 其中第 8 行 提出:

没有路由匹配 {:action=>"show", :controller=>"users", :id=>nil} 缺少必需的键:[:id]

index.html.erb

<% @ribbits.each do |ribbit| %>
    <div class="ribbitWrapper">
        <a href="<%= user_path ribbit.user %>">
            <img class="avatar" src="<% ribbit.user.avatar_url %>" />
            <span class="name"> <%= ribbit.user.name %> </span>
        </a>
        @<%= ribbit.user.username %>
        <span class="time"><%= time_ago_in_words(ribbit.created_at) %></span>
        <p> <%= ribbit.content %></p>
    </div>
<% end %>

用户控制器:

    def new
    @user = User.new
end

def create
  @user = User.create(user_params)

  if @user.save
    session[:user_id] = @user.id
    redirect_to @user, notice: "Thank you for signing up!"
  else
    render 'new'
  end
end

def show
    @user = User.find(params[:id])
    @ribbit = Ribbit.new
end

ribbits 控制器

def index
    @ribbits = Ribbit.all
    @ribbit = Ribbit.new
end

def create
  @ribbit = Ribbit.create(user_ribbits)
  @ribbit.user_id = current_user.id

  if @ribbit.save
      redirect_to current_user 
  else
      flash[:error] = "Problem!"
      redirect_to current_user
  end
end

private

def user_ribbits
  params.require(:ribbit).permit(:content, :userid)
end

def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

helper_method :current_user

还有路由文件

  resources :sessions
  resources :users
  resources :ribbits

  get 'logout', to: 'sessions#destroy', as: 'logout'

  root to: 'users#new'

非常感谢您的帮助!

【问题讨论】:

  • 您能否验证您的每个@ribbits 都有一个不为空的user_id
  • 正如@JoeKennedy 所说,您的用户中似乎存储了一个 nil id 值。如果不是这种情况,请尝试ribbit.user.id 强制它使用 id 值而不是对象本身。 Ruby 魔法应该自己处理,但是……安全总比后悔好。或者可能是您的 avatar_url 调用中断了。那个函数是什么样子的?
  • 这是user.rb pastebin.com/NpTC9Mz9
  • 我去 Rails 控制台搜索了我的 ribbits,实际上,我的 ribbits 没有 user_id。这是pastebin.com/whynYVbQ 的信息请注意,我的 ribbits 只有两个有 user_id,我知道为什么。如何将 user_id 与我的 ribbits 连接起来?

标签: ruby-on-rails ruby


【解决方案1】:

正如我们在问题的 cmets 中发现的,一些 @ribbits 没有 user_id 集。

为了解决您的进一步问题“我如何将 user_id 与我的 ribbits 连接起来,我的猜测是您的 ribbits 的 user_id 为 null,因为您的 user_ribbits 方法允许 :userid 而不是 :user_id。这当然是假设在创建 ribbit 时,您正确地将 user_id 从视图传递到控制器。

为了确保 ribbits 包含 user_id,您可以将以下内容添加到您的 Ribbit 模型 (ribbit.rb):

validates :user_id, presence: true

如果还有其他问题,这至少应该可以防止您创建没有 user_id 的 ribbit。

我希望这会有所帮助!

【讨论】:

  • 不,没用。我仍然可以添加 ribbits,它也会添加到计数器中,但是当我查看 ribbits 时,我仍然得到同样的错误。
  • 它实际上在第 8 行显示错误 pastebin.com/3vgy7r30 我认为它找不到 ribbit.user 的 user_path
  • 您能否将您的RibbitUser 模型添加到问题中?
  • 另外,当你说“不,没用”时,我不明白你的意思。什么没用?将userid 更改为user_id?不管是什么,如果你有一个没有 user_id 的 ribbit,你需要更新它,使它有一个 user_id。在您这样做之前,该错误将继续发生。
  • 是的,将 'userid' 更改为 'user_id' 不起作用。我实际上遵循了一个系列,导师在其中添加了这一行:在 'ribbit.rb' 中的 'attr_accessible :content, :user_id' 但由于 Rails 4 现在不支持 attr_accessible。我在“ribbits 控制器”中添加了一个私有定义(“user_ribbits”)。我不知道我是否应该要求 'params.require(:ribbit)'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2017-07-22
  • 1970-01-01
  • 2021-11-18
  • 2014-10-07
相关资源
最近更新 更多