Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 更新记录,包括联接表_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 更新记录,包括联接表

Ruby on rails 更新记录,包括联接表,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,RubyonRails4 我有一张表格可以编辑记录。表单与“创建新记录”相同。(措辞除外)。当我点击submit时,它会给出nilLNilClass。我的代码用于更新不涉及联接表的其他记录,因此我不确定哪里出了问题 表格: <%= form_for(@test) do |f| %> <div class="field"> <%= f.label :name %><br> <%= f.text_field :name %> &l

RubyonRails4

我有一张表格可以编辑记录。表单与“创建新记录”相同。(措辞除外)。当我点击submit时,它会给出nilLNilClass。我的代码用于更新不涉及联接表的其他记录,因此我不确定哪里出了问题

表格:

<%= form_for(@test) do |f| %>

<div class="field">
  <%= f.label :name %><br>
  <%= f.text_field :name %>
</div>
<div class="field">
  <%= f.label :type %><br>
  <%= f.text_field :type %>
</div>
<div class="field">
  <%= f.label :category %><br>
<%= f.select :category, [ ["IP Voice Telephony", "ip_voice"], ["IP Video Surveillance", "ip_video_surveillance"], ["IP Video Telephony", "ip_video_telephony"], ["Enterprise Gateways", "enterprise_gateways"], ["Consumer ATAs", "consumer_atas"], ["IP PBX", "ip_pbx"] ], {prompt: "Select Category"}, class: "input-lg", :id => "category" %>
</div>
<div class="field">
  <%= f.label :description %><br>
  <%= f.text_field :description %>
</div>

<div id="container" style="width:1140px; margin-left: auto; margin-right: auto;">
<button type="button" class="reset">Reset Search</button>
<table width="100%" class="tablesorter">
<thead>
  <tr>
  <th width="5%" class="filter-false"><input type="checkbox" onClick="toggle(this)"></th>
  <th width="37%" data-placeholder="Search">Content</th>
  <th width="10%" data-placeholder="Search">Type</th>
  <th width="10%" data-placeholder="Search">Category</th>
  <th width="10%" data-placeholder="Search">Product</th>
  <th width="10%" data-placeholder="Search">User</th>
  <th width="8%" data-placeholder="Search">Active</th>
  </tr>
</thead>

<tbody>
  <% @questions.each do |q| %>
  <tr>
    <td><%= check_box_tag "test[question_ids][]", q.id, @test.question_ids.include?(q.id) %></td>
    <td><%= q.content %></td>
    <td><%= q.question_type %></td>
    <td><%= q.category %></td>
    <td>GXP</td>
    <td><%= q.user_id %></td>
    <td><%= q.active %></td>
  </tr>
  <% end %>
 </tbody>
</table>

<br>
</div>
<div class="actions">
  <%= f.submit "Update Test", class: "btn btn-lg btn-primary" %>
</div>
<% end %>
错误:

Started PATCH "/tests/98" for 127.0.0.1 at 2014-05-20 10:12:58 -0400
Processing by TestsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"x=", "test"=>{"name"=>"one two three four, spelling YEah!!", "type"=>"", "category"=>"ip_voice", "description"=>"not so smart, wooops", "question_ids"=>["1"]}, "commit"=>"Update Test", "id"=>"98"}
Test Load (0.3ms)  SELECT "tests".* FROM "tests" WHERE "tests"."id" = ? LIMIT 1  [["id", "98"]]
User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'x' LIMIT 1
Completed 500 Internal Server Error in 6ms

NoMethodError (undefined method `update' for nil:NilClass):
app/controllers/tests_controller.rb:56:in `block in update'
app/controllers/tests_controller.rb:55:in `update'
这是第56行:
if@test.update(测试参数)


我确实认为我必须在edit()中定义@test是因为wierd。我还尝试了@test.save,但出现了相同的错误。我有点误解。

您需要在
更新
操作中定义
@test
。当前未定义其值,因此其值为
nil
,您将收到错误

在调用
@test.update
之前,在
update
操作中添加此行:

@test = Test.find(params[:id])
我看到您在设置测试之前有一个
回调,即
set\u test
。在这种情况下,你不需要

@test = Test.find(params[:id])
update
操作中。您所需要做的就是在操作前的
回调中添加
update
操作,如下所示:

before_action :set_test, only: [:show, :edit, :update, :destroy]  
另外,我建议您从
edit
操作中删除
@test
设置,因为您已经在
操作之前的
回调中添加了
edit
操作

最后,
set\u test
(理想情况下是
private
method)方法应该如下所示:

def set_test
  @test = Test.find(params[:id])
end

您需要在
update
操作中定义
@test
。当前未定义其值,因此其值为
nil
,您将收到错误

在调用
@test.update
之前,在
update
操作中添加此行:

@test = Test.find(params[:id])
我看到您在设置测试之前有一个
回调,即
set\u test
。在这种情况下,你不需要

@test = Test.find(params[:id])
update
操作中。您所需要做的就是在操作前的
回调中添加
update
操作,如下所示:

before_action :set_test, only: [:show, :edit, :update, :destroy]  
另外,我建议您从
edit
操作中删除
@test
设置,因为您已经在
操作之前的
回调中添加了
edit
操作

最后,
set\u test
(理想情况下是
private
method)方法应该如下所示:

def set_test
  @test = Test.find(params[:id])
end

您需要在控制器中这样做

private

def set_test

@test = Test.find(params[:id])

end
在\u操作之前:设置\u测试,仅:[:显示,:编辑,:更新,:销毁]
并且在控制器的末尾

private

def set_test

@test = Test.find(params[:id])

end
另外,像这样更新您的编辑方法

def edit
  #@test = Test.find(params[:id]) remove this line you wont need it.
  @questions = Question.all
end


您只需遵循kirti Thorat的回答即可。

您需要在控制器中执行此操作

private

def set_test

@test = Test.find(params[:id])

end
在\u操作之前:设置\u测试,仅:[:显示,:编辑,:更新,:销毁]
并且在控制器的末尾

private

def set_test

@test = Test.find(params[:id])

end
另外,像这样更新您的编辑方法

def edit
  #@test = Test.find(params[:id]) remove this line you wont need it.
  @questions = Question.all
end



您可以按照kirti Thorat的回答进行操作。

您的控制器中是否有用于设置
@test
变量的
操作之前的
?如果不是的话,你必须定义一个等待,我会,在设置测试之前,只:[:显示,:编辑,:更新,:销毁]这不是你的意思吗?你也必须为此定义操作。检查我的答案。你的控制器中有设置
@test
变量的
操作前
吗?如果不是,您必须定义oneWait,我必须定义oneWait,在\u action:set\u test之前,仅:[:show,:edit,:update,:destroy]这不是您的意思吗?而且您也必须为此定义操作。请检查我的答案。这是否仅适用于联接表记录?我的另一个控制器在edit()中没有定义任何内容?它与联接表记录无关。这是一个基本的Ruby东西,在使用它之前,你必须设置变量(无论是实例变量还是局部变量,在你的例子中是实例变量)的值。我补充了我的问题。这些是否有效?是的,如果您在设置测试之前有
操作
,您只需要在那里添加
操作
名称。正如我之前所说,您是一个巨大的竞争对手!很高兴看到您的答案:)这是否仅用于联接表记录?我的另一个控制器在edit()中没有定义任何内容?它与联接表记录无关。这是一个基本的Ruby东西,在使用它之前,你必须设置变量(无论是实例变量还是局部变量,在你的例子中是实例变量)的值。我补充了我的问题。这些是否有效?是的,如果您在设置测试之前有
操作
,您只需要在那里添加
操作
名称。正如我之前所说,您是一个巨大的竞争对手!很高兴看到你的答案:)哦,好的。很好,一个问题有两个答案D+1Pavan,你有一个打字错误
[:show,:edit,:update.:destroy]
让它成为
:update,:destroy
(注意逗号而不是圆点)最好在你的答案中更正我的名字,它是Kirti而不是Kriti:D@KirtiThorat我的错!更正:DOh,好的。很好,一个问题有两个答案D+1Pavan,你有一个打字错误
[:show,:edit,:update.:destroy]
让它成为
:update,:destroy
(注意逗号而不是圆点)最好在你的答案中更正我的名字,它是Kirti而不是Kriti:D@KirtiThorat我的错!更正:D