1

まず、私のリソースはCommunity モデルでスラッグに to_paramを使用してネストされています。

私は example.com/shop/walmart/topic/14/edit にいます。
キャプチャ入力なしで更新を押すと、フラッシュエラーメッセージが表示されて編集ページに戻るはずです。
ただし、 example.com/shop/14/topic/14/edit に移動します。<= 同じパラメーターを使用しています。最初の引数にはcommunity_nameである 'walmart' を、トピックには:idを指定する必要があります。
すべてのフィールドは、前のページで入力したものと同じに設定されています。どうすればこれを回避できますか? 前のページと同じ URL にリダイレクトする必要があります。

ルート.rb

resources :communities, :path => "shops", do
    resources :community_topics, :path => "topics"      
end

コントローラ

def simple_captcha_check
    if !simple_captcha_valid?
        flash[:error] = 'Wrong Captcha!'

        if request.put? # We came from an edit request
          @community_topic = CommunityTopic.find(params[:id])
          @community_topic.attributes = params[:community_topic]
          render :action => :edit
        elsif request.post? # We came from a new request
          @community_topic = CommunityTopic.new params[:community_topic]
          render :action => :new
        end

    end
end

models/community.rbここではスラッグを使用していることに注意してください

def to_param
  "#{community_name}"
end

ビュー/community_topics/_form.html.erb

<%= form_for @community_topic, :html => { :class => 'form-horizontal' } do |f| %>
  <div class="control-group">
    <%= f.label :title, :class => 'control-label' %>
    <div class="controls">
      <%= f.text_field :title, :class => 'text_field' %>
    </div>
  </div>
  <div class="control-group">
    <%= f.label :body, :class => 'control-label' %>
    <div class="controls">
      <%= f.text_area :body, :class => 'text_area' %>
    </div>
  </div>

    <div class="control-group">
      <div class="controls">
  <%= show_simple_captcha(:label => "human authentication") %>
    </div>
  </div>



  <div class="form-actions">
    <%= f.submit nil, :class => 'btn btn-primary' %>
    <%= link_to t('.cancel', :default => t("helpers.links.cancel")),
                community_topic_index_path, :class => 'btn' %>
  </div>
<% end %>

レーキルート | grep community_topic

      community_community_topics GET    /shops/:community_id/topics(.:format)          community_topics#index
                                 POST   /shops/:community_id/topics(.:format)          community_topics#create
   new_community_community_topic GET    /shops/:community_id/topics/new(.:format)      community_topics#new
  edit_community_community_topic GET    /shops/:community_id/topics/:id/edit(.:format) community_topics#edit
       community_community_topic GET    /shops/:community_id/topics/:id(.:format)      community_topics#show
                                 PUT    /shops/:community_id/topics/:id(.:format)      community_topics#update
                                 DELETE /shops/:community_id/topics/:id(.:format)      community_topics#destroy

ちなみに、コントローラーのインデックスアクションはこんな感じで、ちゃんと動いています!

community_topics_controller.rb #index

  def index
    @community = Community.find_by_community_name(params[:community_id])
    @community_topics = @community.community_topics

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @community_topics }
    end
  end
4

1 に答える 1

1

コントローラーのアクションが表示されず、変数の名前もわかりませんが、ネストされたルートの場合は、すべての URL を名前付きルートまたはポリモーフィック ヘルパー (私のように) で正確に定義する必要があります。

したがって、フォーム ヘルパーは次のようになっている必要があります。

<%= form_for([@community, @community_topic], :html => { :class => 'form-horizontal' }) do |f| %>

/shop/walmart/topic/14/update (または @community_topic が新しいレコードの場合は「new」) にリクエストを送信する必要があります。

community.rb:

you can just

def to_param
  community_name
end

ルート.rb:

resources :communities, :path => "shop", do
  resources :community_topics, :path => "topic"#, :as => :'topic' *
end

# * named route 'community_topic' can conflict with 'community_topics' of standalone route for CommunityTopic. Let it be by default: 'community_community_topic'.
于 2012-12-27T16:32:31.770 に答える