2016-04-28 138 views
0

我试图链接以添加编辑测验链接我的Rails应用程序,但我得到这个错误:没有路线匹配{:action =>“edit”,:controller =>“quiz_bs”,:id => nil}缺少必需的键:[:id]

No route matches {:action=>"edit", :controller=>"quiz_bs", :id=>nil} missing required keys: [:id] 

我已经看过类似的帖子(like this one),但他们的答案似乎并没有解决问题,即使他们提出类似的情况。

错误是出现了此行的我application.html.erb代码:

<li> 
    <% if @user.quiz_bs == nil %> 
     <%= link_to "Body Structure Quiz", quiz_bs_path %> 
    <% else %> 
     <%= link_to "Body Structure Quiz ✓", edit_quiz_b_path(id: @user.quiz_bs) %> 
    <% end %> 
    </li> 

但链接也将是我的节目的用户页面上:

<h4>Body Structure</h4> 
    <% if @user.quiz_bs == nil %> 
    <p><%= link_to "Test Your Body Structure", new_quiz_b_path %></p> 
    <% else %> 
    <h3><%= @user.quiz_bs.bscode %></h3> 
    <p><%= link_to "Retest Results", edit_quiz_b_path(id: @quiz_bs.id) %></p> 
    <% end %> 

这里是我的quiz_bs_controller

class QuizBsController < ApplicationController 
before_action :require_sign_in 

def show 
    @quiz_bs = QuizBs.find(params[:id]) 
end 

def new 
    @quiz_bs = current_user.quiz_bs || current_user.build_quiz_bs 
end 

def create 
    @quiz_bs = QuizBs.new 

    @quiz_bs.bs01 = params[:quiz_bs][:bs01] 
    @quiz_bs.bs02 = params[:quiz_bs][:bs02] 
    @quiz_bs.bs03 = params[:quiz_bs][:bs03] 
    @quiz_bs.bs04 = params[:quiz_bs][:bs04] 
    @quiz_bs.bs05 = params[:quiz_bs][:bs05] 
    @quiz_bs.bs06 = params[:quiz_bs][:bs06] 

    @quiz_bs.user = current_user 

if @quiz_bs.save 
    flash[:notice] = "Quiz results saved successfully." 
    redirect_to user_path(current_user) 
else 
    flash[:alert] = "Sorry, your quiz results failed to save." 
    redirect_to welcome_index_path 
end 
end 

def edit 
@quiz_bs = QuizBs.find(params[:id]) 

@quiz_bs.assign_attributes(quiz_bs_params) 

if @quiz_bs.save 
    flash[:notice] = "Post was updated successfully." 
    redirect_to user_path(current_user) 
else 
    flash.now[:alert] = "There was an error saving the post. Please try again." 
    redirect_to welcome_index_path 
end 
end 

def update 
@quiz_bs = QuizBs.find(params[:id]) 

@quiz_bs.assign_attributes(quiz_bs_params) 

if @quiz_bs.save 
    flash[:notice] = "Post was updated successfully." 
    redirect_to user_path(current_user) 
else 
    flash.now[:alert] = "There was an error saving the post. Please try again." 
    redirect_to welcome_index_path 
end 
end 

private 
def quiz_bs_params 
params.permit(:bs01, :bs02, :bs03, :bs04, :bs05, :bs06) 
end 

end 

而相应的路线是:

 quiz_bs GET /quiz_bs(.:format)    quiz_bs#index 
       POST /quiz_bs(.:format)    quiz_bs#create 
    new_quiz_b GET /quiz_bs/new(.:format)   quiz_bs#new 
    edit_quiz_b GET /quiz_bs/:id/edit(.:format) quiz_bs#edit 
     quiz_b GET /quiz_bs/:id(.:format)   quiz_bs#show 
       PATCH /quiz_bs/:id(.:format)   quiz_bs#update 
       PUT /quiz_bs/:id(.:format)   quiz_bs#update 

我会很感激任何帮助找出问题在这里!

+0

'<%= link_to“Body Structure Quiz✓”,edit_quiz_b_path(id:@quiz_bs.id)%>' – 7urkm3n

+0

在application.html.erb页面中,@quiz_bs的值为零,因为它给出了错误 –

+0

请注意:'edit'方法不应该做任何处理,它只是负责渲染页面。所以,你只需要'@quiz_bs = QuizBs.find(params [:id])',就这些了。 – GoGoCarl

回答

1

application.html.erb,更改为:

<li> 
    <% if current_user.quiz_bs.nil? %> 
     <%= link_to "Body Structure Quiz", quiz_bs_path %> 
    <% else %> 
     <%= link_to "Body Structure Quiz ✓", edit_quiz_b_path(current_user.quiz_bs) %> 
    <% end %> 
    </li> 
  • 我们希望改变@usercurrent_user,因为这种观点是整个网站的模板。无法保证@user将成为每个控制器中的全局变量(并且这可能不是您想要的)。使用current_user方法将始终可用,并让您登录的用户。
  • 注意:id:这里没有必要,通过的模型将被用作id。

users/show.html.erb,更改为:

<h4>Body Structure</h4> 
    <% if @user.quiz_bs == nil %> 
    <p><%= link_to "Test Your Body Structure", new_quiz_b_path %></p> 
    <% else %> 
    <h3><%= @user.quiz_bs.bscode %></h3> 
    <p><%= link_to "Retest Results", edit_quiz_b_path(@user.quiz_bs) %></p> 
    <% end %> 
  • @quiz_b是,你就不会在你的users_controller定义就像你在做quiz_bs_controller一个变量。您正在访问@user.quiz_bs,因此您想要链接到代码中的特定实例。

全球@quiz_b只适用于您定义此变量的页面,该页面可能是quiz_b路径下的任何页面。

最后,在quiz_bs_controller

def quiz_bs_params 
    params.require(:quiz_bs).permit(:bs01, :bs02, :bs03, :bs04, :bs05, :bs06) 
end 

当与形式的结合使用这种方法声明为:

<%= form_for @quiz_bs do |f| %> 

您需要要求您params:quiz_bs为了范围的参数该模型正在编辑中;在这种情况下,@quiz_bs。否则,在更新/创建测验时不会找到变量。

+0

我仍然在参考'application.html.erb'页面上的链接时遇到了一个错误(不幸的是,我认为它甚至不能到达用户显示页面),但是通过这个改变的链接,错误从连接到'<%if user.quiz_bs == nil%>'行的链接,表示'未定义的方法'quiz_bs'为nil:NilClass'。 – Liz

+0

而且我为应用程序视图添加了更多的上下文。 – Liz

+0

@利兹我更新了我的答案。但是,有一件事 - 用户可以有多个quiz_b吗? – GoGoCarl

0

这里是你的问题:

No route matches {:action=>"edit", :controller=>"quiz_bs", :id=>nil} missing required keys: [:id] 

你要通过编辑操作的ID,它的路由结构的一部分。在你的路由输出它甚至可以显示你:

/quiz_bs/:id/edit 

没有这个ID,在/:ID /编辑路线是根本行不通的 - 这是Rails机制。

在你的Gemfile:

group :development do 
    gem 'pry-rails' 
end 

和:

bundle install 
application.html.erb这种逻辑上面

然后做:

<% binding.pry %> 
<% if @user.quiz_bs == nil %> 
    <p><%= link_to "Test Your Body Structure", new_quiz_b_path %></p> 
<% else %> 
    <h3><%= @user.quiz_bs.bscode %></h3> 
    <p><%= link_to "Retest Results", edit_quiz_b_path(id: @quiz_bs.id) %></p> 
<% end %> 

现在,再次点击页面。 Pry将产生一个调试断点,这将允许您评估服务器当前正在运行的终端中的@user对象。我对你最好的建议是学习调试你自己的代码 - 这是一个情境,有很多你不能提供访问你的应用程序不能提供的上下文。

相关问题