尝试创建推文时出现错误“找不到没有ID的用户”

时间:2018-09-28 22:42:26

标签: ruby-on-rails ruby erb

我正在尝试创建一个Twitter克隆,其中一条推文在其旁边显示用户的用户名。但是,收到上述错误消息并突出显示我的create方法的第一行。关于如何解决的任何想法。 我已经完成了关联。 谢谢

class TweetsController < ApplicationController

  def index
    @tweets = Tweet.all.order("created_at DESC")
    @tweet = Tweet.new
  end

  def show
    @tweet = Tweet.find(params[:id])
  end

  def new
    # @tweet = Tweet.new
  end

  def create
    @user = User.find(params[:id])
    @tweet = Tweet.new(tweet_params)
    @tweet.user = @user
    if @tweet.save
      redirect_to tweets_path
    end
  end

  private

  def tweet_params
    params.require(:tweet).permit(:content, :user_id)
  end

end

推文

<%= simple_form_for @tweet, id: "form-submit" do |f| %>
   <%= f.input :content %>
   <%= f.button :submit, class: "btn btn-danger" %>
<% end %>

<% @tweets.each do |tweet| %>
  <ul>
    <li>
      <%= tweet.content %>
      <%= tweet.user.username %>
    </li>
  </ul>
<% end %>

4 个答案:

答案 0 :(得分:1)

您的表单没有id字段,因此params[:id]nil

答案 1 :(得分:0)

params哈希不包含id,因为您收到此错误。

只需将您的创建操作修改为

  def create
    @user = current_user
    @tweet = Tweet.new(tweet_params)
    @tweet.user = current_user
    if @tweet.save
      redirect_to tweets_path
    end
  end

除了上面的内容外,您还可以从表单中传递一个user_id

<%= simple_form_for @tweet, id: "form-submit" do |f| %>
   <%= f.input :content %>
   <%= f.hidden_field :user_id, value: current_user.try(:id) %>
   <%= f.button :submit, class: "btn btn-danger" %>
<% end %>

然后将创建操作修改为

  def create
    @tweet = Tweet.new(tweet_params)
    if @tweet.save
      redirect_to tweets_path
    end
  end

注意:假设您正在使用devise gem进行身份验证

答案 2 :(得分:0)

您在使用tweet_params后定义了tweet.users,因为未定义tweet_params用户,这就是为什么出现此错误的原因。

答案 3 :(得分:0)

通过在此处接受答案,最合适的更改可能是:

  def new
    @tweet = current_user.tweets.new
  end

  def create
    @tweet = Tweet.new(tweet_params)
    if @tweet.save
      redirect_to tweets_path
    end
  end

不需要做任何其他事情。