Rails条件语句

时间:2016-03-10 12:34:20

标签: ruby-on-rails ruby

我不知道我的标题是好还是床,因为我在轨道上的红宝石中是新的,我在解决一个条件问题,如下例所示。

我有三张表userpost& saved_post

用户表

user_id | user_name | 
---------------------
   1    |    ABC    |
---------------------
   2    |   efg     |

发表表格

 post_id  |  title  |
 --------------------
    1     |   XYZ   |
 --------------------
    2     |    xyz  |

saved_post表

 id  |  user_id  |  post_id  |
 -----------------------------
   1 |      1    |    2      |

查看

<% @post.each do |p| %>
    <%= p.post_title %>
      <%= form_for :create, url: home_path(@save), action: :create, method: :post  do |f| %>
      <%= f.hidden_field :post_id, :value => p.post_id %>
      <button class="btn btn-default btn-save" type="submit">Save</button>
        <% end %>
    <% end %>

如果user_id 1post_id 2表格中保存saved_post,则会显示此信息 仅保存user_id 1,否则显示保存。

我如何才能达到此解决方案?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用Active Record的has_many :through关联。 请参阅此link

class Users < ActiveRecord::Base
  has_many :posts
  has_many :saved_posts, through: :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
  belongs_to :saved_post
end

class SavedPost < ActiveRecord::Base
  has_many :posts
  has_many :users, through: :posts
end

有关此内容的更多详细信息,请参阅上面的链接。

答案 1 :(得分:0)

Rails是关于约定优于配置的。这意味着如果您按照Rails约定编写Rails应用程序,您将从中获得巨大的好处。

您的表格应以复数形式命名。表和帖子。我从您的评论中理解的是,用户有很多帖子,帖子可以属于很多用户。这是典型的has_and_belongs_to_many关联。

如果将saved_post表重命名为posts_users(两个表名都按字母顺序排列),Rails将知道如何自动处理这些表。

数据库应如下所示:

enter image description here

我使用您的两个用户和方法制作了一个示例应用程序,以便向其中任何一个用户添加帖子。

  # routes.rb
  root 'posts#index'
  resources :posts


  # posts_controller.rb
  class PostsController < ApplicationController
  before_action :set_user

  def index
    @posts = @current_user.posts
  end

  def new
    @post = @current_user.posts.build(title: 'totally new title')
  end

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

  def create
    @post = Post.new(post_params)
    @post.save
    redirect_to posts_path
  end

  def update
    @post = Post.find(params[:id])
    if @post.update(post_params)
      redirect_to posts_path
    else
      render 'edit'
    end
  end

  # --------------------------------------------------------------------------
  private
  # --------------------------------------------------------------------------

  # Sets the user based on the params value
  def set_user
    if params[:user_id]
      @current_user = User.find(params[:user_id])
    else
      # If not found, sets the first from the Users table
      @current_user = User.first
    end
  end

  def post_params
    params.require(:post).permit(:title, {user_ids: []})
  end
end

<强>索引

enter image description here

# index.html.erb
<h3>Users</h3>
<% User.all.each do |user| %>
  <%= link_to user.username, posts_path(user_id: user.id) %> <br />
<% end %>

<h3>Posts for the user: <%= @current_user.username %></h3>

<p>
  <% @posts.each do |post| %>
    <%= link_to post.title, edit_post_path(post) %> <br />
  <% end %>
</p>

<p>
  <%= link_to 'Create new post', new_post_path %>
</p>

修改中,您可以选择将哪些用户附加到此帖子:

enter image description here

# edit.html.erb
<%= render :partial => "post_form", locals: {button_name: 'update'} %>

# _post_form.html.erb
 <h3>Post <%= @post.title %> for the user <%= @current_user.username %></h3>

<%= form_for @post do |f| %>
  <%= f.text_field :title %> <br />
    <p>
      <label>
        <%= f.collection_check_boxes(:user_ids, User.all, :id, :username) %>
      <label><br />
    </p>
    <p>
    <%= f.submit button_name, class: "btn btn-default btn-save" %>
  </p>
<% end %>

在post.rb和user.rb文件中,您需要指定这两个类之间的关联。当你正确地命名了posts_users表时,Rails会自动找到它。

# post.rb
class Post < ActiveRecord::Base
  has_and_belongs_to_many :users
end

# user.rb
class User < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

如果您创建新标题,if将使用相同的表单:

enter image description here

# new.html.erb
<%= render :partial => "post_form", locals: {button_name: 'create'} %>