0

投稿の作成時に user_id を設定するのに問題があります

def create

  @post = Post.new(post_params)
  @post.user_id = session[:id]

  respond_to do |format|
    if @post.save
      format.html { redirect_to @post, notice: 'Post was successfully created.' }
      format.json { render action: 'show', status: :created, location: @post }
    else
      format.html { render action: 'new' }
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
end

私が得るエラーは、特にundefined method 'username' for nil:NilClassショーアクションにリダイレクトされたときです。データベースを見ると、user_id が設定されていないことがわかります。

また、user_id を隠しフィールドとして渡そうとしました。しかし、これも機能しませんでした (ログを見ると、隠しフィールドが何らかの理由で渡されていないことがわかりました)。

正しい方向へのポイントをいただければ幸いです。

ありがとうございました !

編集:ここで要求されたのはショーコントローラーです

def show
    @post = Post.find(params[:id])

    @original_id = params[:original_id]

    @comment = Comment.new
end

<%= form_for [:admin, @post] do |f| %>
  <% if @post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
      <% @post.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

以下はフォームです

  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :content %><br>
    <%= f.text_area :content %>
  </div>
  <div class="field">
    <%= f.label :category %><br>
    <%= f.text_field :category %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

ルート:

ルート「posts#index」

  resources :posts do
    resources :comments, shallow: true
  end

  resources :users, only: [:create]

  #Posts
  get "/meta", to: "posts#meta"

  #User Routes
  get "/signup", to: "users#new"
  get "/success", to: "users#index"

  #login Routes
  get "/login", to: "sessions#login"
  post "/sessions/login_attempt", to: "sessions#login_attempt"

  #session routes
  get "/sessions/home", to: "sessions#home"
  get "/sessions/logout", to: "sessions#logout"

  #admin routes
  #resources :posts, module: 'admin', except: [:show, :index]
  namespace :admin do 
    root 'posts#new'
    resources :posts, except: [:show, :index]
  end
4

3 に答える 3

3

作成メソッド内に追加します

@post = Post.build(params[:post])
@post.user_id = current_user.id

これにより、指定された投稿の現在のユーザー ID が取得されます。

于 2013-10-15T14:59:22.917 に答える
0

投稿とユーザーの間に has_many 関係がある場合は、次のようにしてみませんか。

@user = User.find(params[:id])
@post = @user.posts.new(params[:post])

パラメータは異なる場合がありますが、これは「よりルビーな」方法です。2 つのモデル間の関係が明確に示されています。上記のコードは #new アクションにある必要があり、作成アクション内に保存します。

于 2013-10-15T14:58:41.460 に答える
0

私は今、ばかのように感じますが、問題は、session[:user_id] ではなく、session[:id] を使用していたことです。

私のセッションコントローラに設定

def login_attempt
authorized_user = RegisteredUser.authenticate(params[:username_or_email],params[:login_password])
    if authorized_user
      session[:user_id] = authorized_user.id
      flash[:notice] = "Wow Welcome again, you logged in as #{authorized_user.username}"
      redirect_to(:action => 'index', :controller => "users")
    else
      flash[:notice] = "Invalid Username or Password"
      flash[:color]= "invalid"
      render "login"    
    end   
end
于 2013-10-15T22:32:30.157 に答える