Rails,表单中的第一个参数不能包含nil或为空

时间:2017-05-05 23:00:29

标签: ruby-on-rails

我正在关注https://coderwall.com/p/rqjjca/creating-a-scoped-invitation-system-for-rails,我遇到了这个

<%= form_for @invite , :url => invites_path do |f| %>

<%= @invite.story_id=1  %> 

    <%= f.hidden_field :story_id, :value => @invite.story_id %>
    <%= f.label :email %>
    <%= f.email_field :email %>
    <%= f.submit 'Send' %>
<% end %>

我在本教程中迷失了,因为我找不到示例代码。

究竟是什么:url标签?那可以硬编码进行测试吗?

class InvitesController < ApplicationController

    def create
  @invite = Invite.new(invite_params)
  @invite.sender_id = current_user.id
  @invite.recipient = 1

    end

 def invite_params
    params.require(:story).permit(:title, :body, :user_id)



  end
end

我该如何处理?

2 个答案:

答案 0 :(得分:2)

关于你问题的主题,我认为这是你收到的错误。在这种情况下,这意味着您的@invite变量为nil。在本教程中,它指出作者将表单放在用户组的“edit视图”上。所以在你的控制器中,你需要引用那个变量。像这样:

def edit
  @invite = Invite.find(params[:id])
end

关于:url问题:

:url选项是表单提交的网址。

以下是docs中的内容:

  

:url - 要提交表单的网址。这可以用与传递给url_for或link_to的值相同的方式表示。例如,您可以直接使用命名路由。当模型由字符串或符号表示时,如上例所示,如果未指定:url选项,默认情况下表单将被发送回当前url(我们将在下面描述一个替代的面向资源的用法form_for,其中不需要明确指定URL。

在本教程的前面您添加了:

resources :invites

routes.rb文件。这将为邀请创建命名路由。

您可以通过输入rake routes来查看这些内容。

这将是这样的:

             invites GET        /invites(.:format)                                     invites#index
                     POST       /invites(.:format)                                     invites#create
          new_invite GET        /invites/new(.:format)                                 invites#new
         edit_invite GET        /invites/:id/edit(.:format)                            invites#edit
              invite GET        /invites/:id(.:format)                                 invites#show
                     PATCH      /invites/:id(.:format)                                 invites#update
                     PUT        /invites/:id(.:format)                                 invites#update
                     DELETE     /invites/:id(.:format)                                 invites#destroy

因此,通过将form_for :url => invites_path放入,这意味着您将把表单提交到'/ invites'路由,这与邀请#sedex action相关。

答案 1 :(得分:0)

您需要在控制器中添加新的def

def new
   @invite = Invite.new
结束