2

Ruby on Rails でイメージボードを書いています。

新しい投稿を作成するためのフォームがあります。そのフォームには、投稿が board#show または topic#show から作成されたかどうかを判断し、それに応じて動作するロジックがあります。それは:

  <% if @board != nil %>
    <%= f.hidden_field :board_id, :value => @board.id %>
  <% end %>

  <% if @topic != nil %>
    <%= f.hidden_field :topic_id, :value => @topic.id %>
  <% end %>

フォームは、次のコードで board#show および topic#show にレンダリングされます。

<%= render :partial => 'posts/form'%>

そのロジックをコントローラーに移動する必要がありますか? どうすればそれを行うことができますか?

4

3 に答える 3

1

コントローラーに入れる必要はないと思います。私は使用します:locals。だからでboard#show

<%= render :partial => 'posts/form', :locals => {:resource => @board} %>

で同じことを行いますtopic#showが、 を使用し@topicます。次に、フォームの部分で:

<%= f.hidden_field "#{resource.model_name.downcase}_id", :value => resource.id %>

model_name を取得するもっとエレガントな方法があるかもしれませんが、それが私がとる方向です。

于 2012-07-18T22:01:25.690 に答える
1

このままでは、おそらく問題ありません。ただし、(アプリによっては) ネストされたルートを使用して URL にボード/トピック情報を配置することで、少し調整することができます。次のようなルート:

/boards/4/posts
/topics/133/posts

次に、「ボードまたは投稿からですか」ロジックが PostsController で発生する可能性があります。繰り返しますが、これが「より良い」かどうかは要件に依存しますが、これはこれにアプローチする別の方法です。

補足として、条件文を少しスリムにすることができます。if @boardと同じです ( .であるという特殊なケースがあり、 両方とも false と評価される場合if @board != nilを除きます)。@boardfalsenilfalse

于 2012-07-18T22:01:56.273 に答える
0

この関係については、ポリモーフィックな関係も考慮する必要があります。ぴったりかどうかはわかりませんが、試してみる価値はありそうです。

それ以外の場合は、nil を渡しても問題ありません。あなたはただ行うことができます:

<%= f.hidden_field :board_id, :value => @board.try(:id) %>
<%= f.hidden_field :topic_id, :value => @topic.try(:id) %>

考えてみると、理想的には、コントローラーはフィールドをあなたが持っているものに割り当てる必要がfあり、コードは次のようになります。

<%= f.hidden_field :board_id %>
<%= f.hidden_field :topic_id %>

と同等のコードを実行@post.board_id = @board.idするだけです。あなたもそれを行うことができ、それは自動的にIDを割り当てるはずです。board#showtopic#show@post = @board.posts.build

于 2012-07-18T22:21:33.363 に答える