RoR - UrlGenerationError,没有路由匹配,缺少必需的键[:id]

时间:2015-04-21 19:40:27

标签: ruby-on-rails ruby

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

  

Ribbits中的ActionController :: UrlGenerationError #index显示   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'

真的很感激帮助!

1 个答案:

答案 0 :(得分:1)

正如我们在对该问题的评论中发现的,@ribbits部分user_id没有user_ribbits设置。

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

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

{{1}}

如果还有其他问题,这至少可以防止你在没有user_id的情况下创建一个ribbit。

我希望这有帮助!