【问题标题】:Rails How to pass params in cross model systemRails如何在跨模型系统中传递参数
【发布时间】:2015-10-29 17:41:57
【问题描述】:

我无法弄清楚将参数传递给链接标签的方法。我想要做的是当有人点击加入组链接时,会员模型应该有一个新行,其中 group_id 作为当前组 id,用户 id 作为当前用户 id。 Membership 模型目前由两列组成:将用户映射到组的 user_id 和 group_id。任何人都可以帮助我解决我所犯的错误。 这是代码 组:show.html.erb

    <p id="notice"><%= notice %></p>

<p>
  <strong>Title:</strong>
  <%= @group.title %>
</p>

<p>
  <strong>Desc:</strong>
  <%= @group.desc %>
</p>

<p>
  <strong>Creator:</strong>
  <%= @creator.first_name %>
</p>
<%= link_to 'Join Group', memberships_path(:group_id => @group.id, :user_id => current_user.id ), method: :post %>
<%= link_to 'Edit', edit_group_path(@group) %> |
<%= link_to 'Back', groups_path %>

这里是会员控制器

class MembershipsController < ApplicationController
  before_action :set_membership, only: [:show, :edit, :update, :destroy]

  # GET /memberships
  # GET /memberships.json
  def index
    @memberships = Membership.all
  end

  # GET /memberships/1
  # GET /memberships/1.json
  def show
    @membership = Membership.find(params[:id])
    @user = User.find(@membership.user_id)
    @group = Group.find(@membership.group_id)
  end

  # GET /memberships/new
  def new
    @membership = Membership.new
  end

  # GET /memberships/1/edit
  def edit
  end

  # POST /memberships
  # POST /memberships.json
  def create
    @membership = Membership.new(membership_params)

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

  # PATCH/PUT /memberships/1
  # PATCH/PUT /memberships/1.json
  def update
    respond_to do |format|
      if @membership.update(membership_params)
        format.html { redirect_to @membership, notice: 'Membership was successfully updated.' }
        format.json { render :show, status: :ok, location: @membership }
      else
        format.html { render :edit }
        format.json { render json: @membership.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /memberships/1
  # DELETE /memberships/1.json
  def destroy
    @membership.destroy
    respond_to do |format|
      format.html { redirect_to memberships_url, notice: 'Membership was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_membership
      @membership = Membership.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def membership_params
      params.require(:membership).permit(:user_id, :group_id)
    end
end

【问题讨论】:

    标签: ruby-on-rails ruby params


    【解决方案1】:

    您的控制器中应该有一个方法来处理将用户添加到组中,例如:

    class MembershipsController < ApplicationController
    
        ...
    
        def join_group
            @user = User.find(params[:user]
            @user.group_id = params[:group_id].to_i
        end
    
        ...
    
    end
    

    那么 routes.rb 需要该控制器方法的路径:

    get 'memberships/join_group' => 'memberships#join_group'
    

    这将产生一个类似memberships_join_group_path 的路径,您将在link_to 中使用它:

    <%= link_to 'Join Group', memberships_join_group_path(:group_id => @group.id, :user_id => current_user.id ) %>
    

    您当前使用的路径正在将参数发送到您的 index 方法。

    【讨论】:

    • 但这不会将其存储到会员数据库中。
    • 这不是你要解决的问题吗?你说你的问题是通过link_to传递参数,我回答了。如果您无法在 join_group 方法中提出逻辑,那是一个单独的问题。
    • 对不起,我对 Rails 比较陌生。我正在尝试 def join_group @user = User.find(current_user.id) Membership.new( user_id: current_user.id, group_id: @group.id) Membership.save end
    • 然后,您需要使用 new_membership_path 而不是 member_path,而不是 join_group 方法,并将您在评论中定义的逻辑放在那里。您可以忽略有关更改路线的部分,因为您应该已经有了新方法的路径。
    【解决方案2】:

    试试

    def create
    
        @member = current_user.members.build(:group_id => params[:group_id])
        if @member.save
          flash[:notice] = "You have joined this group."
          redirect_to members_path
        else
          flash[:error] = "Unable to join."
          redirect_to members_path
        end
      end
    

    并使用会员而不是会员

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      相关资源
      最近更新 更多