我之前问过this question并且找到了我需要的方式的一部分。
我有一个简单的应用程序,有三个表。用户,机器人和收件人。机器人属于用户,收件人属于机器人。
在机器人展示页面上,我希望能够在机器人展示页面内为该机器人创建收件人。
我在机器人显示页面中有以下代码,其中列出了当前收件人:
<table>
<% @robot.recipients.each do |recipient| %>
<tr>
<td><b><%=h recipient.chat_screen_name %></b> via <%=h recipient.protocol_name</td>
<td><%= link_to 'Edit', edit_recipient_path(recipient) %> </td>
<td><%= link_to 'Delete', recipient, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
</table>
现在我在Robot show视图中有这个:
<% form_for(@recipient) do |f| %>
Enter the screen name<br>
<%= f.text_field :chat_screen_name %>
<p>
<%= f.submit 'Update' %>
</p>
<% end %>
并且机器人控制器也添加了它:
@recipient = Recipient.new
@recipients = Recipient.all
我现在看到了我想要看到的字段,但似乎收件人仍然没有与用户所在的显示页面的机器人相关联。此外,当我有这个代码时,创建时的重定向将转到收件人索引页面,而不是机器人显示页面。
我在create action中的配方控制器中有这个代码:
def create
@recipient = Recipient.new(params[:recipient])
respond_to do |format|
if @recipient.save
flash[:notice] = 'The new recipient was successfully added.'
format.html { redirect_to (robot_path(@recipient.robot)) }
format.xml { render :xml => @recipient, :status => :created, :location => @recipient }
else
format.html { render :action => "new" }
format.xml { render :xml => @recipient.errors, :status => :unprocessable_entity }
end
end
end
我真的很感激任何额外的帮助。我知道我接近解决方案,但不是那里......:)
感谢。
答案 0 :(得分:1)
@recipient = Recipient.new(params[:recipient])
这会根据提交的表单创建一个新的收件人,但表单中没有任何内容可指定您要使用的机器人。因为没有params [:recipient] [:robot_id],所以不能有@ recipient.robot。
尝试嵌套资源并从url参数访问机器人ID,或尝试传递包含机器人ID的隐藏字段并从提交的表单中访问它。
此处的关键点:params [:recipient]仅包含从表单传递的内容,并且您没有将机器人ID传递到任何位置。
答案 1 :(得分:0)
使用嵌套路线然后在create :(这是另一种方法略有不同的方法)
@robot = Robot.find(params[:bug_id])
@recipient = Robot.recipients.new(params[:recipient])
这会自动创建@recipient
并正确设置robot_id
。