将一个模型的创建操作放在另一个模型的显示页面中

时间:2010-06-14 19:56:19

标签: ruby-on-rails

我之前问过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) %>&nbsp;</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

我真的很感激任何额外的帮助。我知道我接近解决方案,但不是那里......:)

感谢。

2 个答案:

答案 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