0

フォームを使用して投稿を追加しています。現在のユーザーのIDをエントリパラメーターと一緒に送信する必要があります。これが私のフォームコードです:

<%= form_for [@topic, @post] do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
        <%= f.hidden_field :user_id, :value => current_user.id %>
    <%= f.hidden_field :topic_id, :value => topic.id %>
        <%= f.text_area :content, placeholder: "yorumunuzu girin..." %>
  </div>
  <%= f.submit "Gönder", class: "btn btn-large btn-primary" %>
<% end %>

と私のposts_controller:

def new
        @topic= Topic.find_by_id(params[:id])
        @post = @topic.posts.build(params[:post])
    end

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

    def create
        @topic= Topic.find_by_id(params[:id])
        @post = @topic.posts.build(params[:post])
        if @post.save
            flash[:success] = "Konu oluşturuldu!"
            redirect_to topic_path(topic)
        else
            render 'static_pages/home'
        end
    end

私はパーシャルを使用しているので、topic_controller.rbでこれらのコードを使用します

  def show      
        @topic = Topic.find(params[:id])
        @posts = @topic.posts.paginate(page: params[:page])
        @post = @topic.posts.build if signed_in?
  end

リソースをネストしました:

resources :users
resources :sessions, only: [:new, :create, :destroy]

resources :topics , only: [:show, :create, :destroy] do
resources :posts, only: [:create, :show, :new]
end

。コメントを投稿すると、エラーログは次のようになります。

{"utf8"=>"✓",
 "authenticity_token"=>"y0wzskqK9LfXSPIYW4EmqRii1Tg7bD1CG0kno+gcagQ=",
 "post"=>{"user_id"=>"1",
 "content"=>"yeni yorum"},
 "commit"=>"Gönder",
 "topic_id"=>"3"}

したがって、投稿しませんtopic_id。トピック表示ページでは、トピック、それに属する投稿、投稿フォームを表示したいと思います。そして、ユーザーがコメントを投稿したときに、同じページにリダイレクトしたいのですredirect_to topic_path(topic)が、正しいか間違っていますか?読んでくれてありがとう。

編集1:私は以下の解決策を試しました。私が変更され

<%= f.hidden_field :user_id, :value => current_user.id %>
<%= f.hidden_field :topic_id, :value => @post.topic.id %>

エラーコードが変更されました

 undefined method `posts' for nil:NilClass
{"utf8"=>"✓",
 "authenticity_token"=>"y0wzskqK9LfXSPIYW4EmqRii1Tg7bD1CG0kno+gcagQ=",
 "post"=>{"user_id"=>"1",
 "topic_id"=>"3",
 "content"=>"yorum"},
 "commit"=>"Gönder",
 "topic_id"=>"3"}

新しいアクションを編集する必要があります。私の心は立ち往生していますが、私はあきらめません。

4

3 に答える 3

1

ルート(トピックの下の投稿)がネストされており、フォームを作成しているので、コントローラーから次の場所にアクセスできる<%= form_for [@topic, @post] do |f| ... %>はずです。topic_id

params[:topic_id]

(ルーティングのおかげで)

topic_idただし、投稿に直接割り当てるのではなく、トピックインスタンスを割り当てる必要があります。

# wrong (security flaw)
@post.topic_id = params[:topic_id]

# correct
@post.topic = Topic.find(params[:topic_id])

そうすれば、トピックに必要なチェックを行うことができます。トピックが存在すること、ユーザーがトピックを使用できることなどを確認してください。そうでない場合、ユーザーは必要な値を簡単に送信できます。

[編集]

同じ理由で、フォームに投稿したくない場合はuser_id、非表示のフィールドであっても、悪意のあるユーザーによって手動で変更される可能性があるためです。代わりに、コントローラーに投稿するユーザーを割り当てます。

@post.user = current_user
于 2012-06-27T09:01:36.550 に答える
0

これが私の問題の解決策です:

posts_controller.rb:

class PostsController < ApplicationController
    before_filter :signed_in_user, only: [:create, :destroy]
  before_filter :correct_user, only: :destroy


    def new
   @topic= Topic.find(params[:topic_id])
   @post = @topic.posts.build
  end

    def create
        @topic= Topic.find(params[:topic_id])
        @post = @topic.posts.build(params[:post])
        @post.user = current_user
        @post.topic_id = @topic.id

        if @post.save
            flash[:success] = "Konu oluşturuldu!"
            redirect_to topic_path(@topic)
        else
            render 'static_pages/home'
        end
    end

  def destroy
    @post.destroy
    redirect_to root_path
  end
  private

    def correct_user
      @post = current_user.posts.find_by_id(params[:id])
      redirect_to root_path if @post.nil?
    end
end

そして_post_form.html.erb

  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">


        <%= f.text_area :content, placeholder: "yorumunuzu girin..." %>
  </div>
  <%= f.submit "Gönder", class: "btn btn-large btn-primary" %>
<% end %>

およびルート テーブル routes.rb :

resources :topics , only: [:show, :create, :destroy] do
    resources :posts, only: [:create, :new]
    end

投稿を書くことができ、トピック ページに表示されます。この問題に 2 日間費やしました。すべての助けに感謝します。

于 2012-06-27T13:21:12.693 に答える
0

送信後に値を送信する非表示のフォーム フィールドを追加することをお勧めします。必ず update_attribute または create メソッドにハッシュ キー値を追加してください。

注: 非表示フィールドでは、次のように実際の値キーを追加して値を設定する必要があります。

f.hidden_field, :topic_id, :value => post.topic.id

次に、更新または作成関数で、送信されたパラメーター値を次のように追加します。

n = Comment.new
n.topic_id = params[:form_key][:topic_id].to_i

楽しんで

于 2012-06-27T07:48:50.823 に答える